# Perplexity Research Agent

A focused research application that leverages Perplexity's `sonar-reasoning-pro` model through OpenRouter for comprehensive research with real-time web search capabilities.

## Features

- **🧠 Advanced Reasoning**: Uses Perplexity's sonar-reasoning-pro model for superior reasoning capabilities
- **🌐 Real-time Web Search**: Access to current information with source citations
- **📱 Streamlit Interface**: Beautiful web interface for interactive research
- **💻 CLI Interface**: Command-line tools for automation and scripting
- **📊 Performance Metrics**: Detailed timing, confidence scores, and token usage tracking
- **💾 Export Options**: Download results as JSON or Markdown
- **📚 Research History**: Track and review previous research sessions

## Quick Start

### Prerequisites

1. **OpenRouter API Key**: Get your API key from [OpenRouter](https://openrouter.ai/)
2. **Environment Setup**: Add your API key to the environment:
   ```bash
   export OPENROUTER_API_KEY="your-api-key-here"
   ```

### Installation

The research agent is included in the main project. Install dependencies:

```bash
# Install project dependencies
uv pip install -e ".[dev]"

# Or install streamlit separately if needed
uv pip install streamlit
```

### Usage

#### 1. Streamlit Web Interface

Launch the interactive web interface:

```bash
# Using the launcher script
python launch_research_agent.py

# Or directly with streamlit
uv run streamlit run src/research_agent_app.py
```

The interface will open at `http://localhost:8501`

#### 2. CLI Interface

Use the command-line interface for automation:

```bash
# Single research query
uv run python -m src.cli.research query -q "What are the latest developments in AI reasoning models?"

# With additional context
uv run python -m src.cli.research query -q "How do vector databases compare?" -c "Focus on 2025 trends"

# Export to file
uv run python -m src.cli.research query -q "Your query" -o results.json -f json

# List available models
uv run python -m src.cli.research models

# Batch processing
uv run python -m src.cli.research batch -f queries.txt -o results/
```

#### 3. Programmatic Usage

Use the research agent in your Python code:

```python
import asyncio
from src.services.protocols import ResearchQuery
from src.services.research.service import OpenRouterResearchService
from src.services.research.config import ResearchConfig

async def conduct_research():
    # Initialize service
    config = ResearchConfig.from_env("your-api-key")
    service = OpenRouterResearchService(config)
    
    # Create query
    query = ResearchQuery(
        query="What are the latest developments in AI reasoning models?",
        context="Focus on models like o1 and o3",
        max_tokens=4000,
        temperature=0.1,
        model="perplexity/sonar-reasoning-pro"
    )
    
    # Conduct research
    result = await service.research(query)
    
    print(f"Answer: {result.answer}")
    print(f"Confidence: {result.confidence_score:.1%}")
    print(f"Sources: {result.sources}")

# Run the research
asyncio.run(conduct_research())
```

## Configuration

### Environment Variables

- `OPENROUTER_API_KEY`: Your OpenRouter API key (required)

### Research Parameters

- **Model**: `perplexity/sonar-reasoning-pro` (default)
- **Max Tokens**: 1000-4000 (default: 4000)
- **Temperature**: 0.0-1.0 (default: 0.1)
- **Context**: Optional additional context for the research

## API Reference

### ResearchQuery

```python
@dataclass
class ResearchQuery:
    query: str                    # Research question
    context: Optional[str] = None # Additional context
    max_tokens: int = 4000        # Maximum response length
    temperature: float = 0.1      # Response creativity
    model: str = "perplexity/sonar-reasoning-pro"
```

### ResearchResult

```python
@dataclass
class ResearchResult:
    query: str                    # Original query
    answer: str                   # Research answer
    sources: List[str]            # Source URLs
    confidence_score: float       # Confidence (0.0-1.0)
    processing_time: float        # Processing time in seconds
    model_used: str              # Model that generated the response
    token_usage: Dict[str, int]   # Token usage statistics
```

### OpenRouterResearchService

```python
class OpenRouterResearchService:
    async def research(self, query: ResearchQuery) -> ResearchResult
    async def batch_research(self, queries: List[ResearchQuery]) -> List[ResearchResult]
    def get_available_models(self) -> List[str]
```

## Examples

### Example 1: Basic Research

```python
from src.services.protocols import ResearchQuery
from src.services.research.service import OpenRouterResearchService

async def basic_research():
    service = OpenRouterResearchService()
    
    query = ResearchQuery(
        query="What are the latest developments in AI reasoning models?"
    )
    
    result = await service.research(query)
    print(result.answer)
```

### Example 2: Research with Context

```python
query = ResearchQuery(
    query="How do vector databases compare for RAG applications?",
    context="I'm building a personal knowledge management system for processing research papers",
    temperature=0.2
)
```

### Example 3: Batch Processing

```python
queries = [
    ResearchQuery(query="Query 1"),
    ResearchQuery(query="Query 2"),
    ResearchQuery(query="Query 3")
]

results = await service.batch_research(queries)
for result in results:
    print(f"Query: {result.query}")
    print(f"Answer: {result.answer[:100]}...")
```

## CLI Commands

### Single Query

```bash
# Basic query
uv run python -m src.cli.research query -q "Your research question"

# With options
uv run python -m src.cli.research query \
  -q "Your question" \
  -c "Additional context" \
  -m 3000 \
  -t 0.2 \
  -o results.json \
  -f json
```

### Batch Processing

```bash
# Create queries file
echo "Query 1" > queries.txt
echo "Query 2" >> queries.txt
echo "Query 3" >> queries.txt

# Run batch research
uv run python -m src.cli.research batch \
  -f queries.txt \
  -o results/ \
  --format json
```

### Model Information

```bash
# List available models
uv run python -m src.cli.research models
```

## Performance

### Expected Performance

- **Processing Time**: 2-5 seconds per query
- **Confidence Score**: 80-95% for well-formed queries
- **Token Usage**: 1000-2000 tokens per response
- **Sources**: 3-8 relevant sources per query

### Optimization Tips

1. **Clear Queries**: Be specific and clear in your research questions
2. **Context Usage**: Provide relevant context to improve accuracy
3. **Temperature**: Use lower values (0.1-0.3) for factual research
4. **Batch Processing**: Use batch mode for multiple related queries

## Troubleshooting

### Common Issues

1. **API Key Error**
   ```
   ❌ OPENROUTER_API_KEY not found in environment
   ```
   **Solution**: Set your OpenRouter API key in the environment

2. **Model Not Available**
   ```
   ❌ Model perplexity/sonar-reasoning-pro not available
   ```
   **Solution**: Check available models with `uv run python -m src.cli.research models`

3. **Rate Limiting**
   ```
   ❌ Rate limit exceeded
   ```
   **Solution**: Wait a moment and retry, or check your OpenRouter usage limits

4. **Network Issues**
   ```
   ❌ Connection failed
   ```
   **Solution**: Check your internet connection and OpenRouter service status

### Debug Mode

Enable debug logging:

```bash
export TASKMASTER_LOG_LEVEL=DEBUG
uv run python -m src.cli.research query -q "Your query"
```

## Testing

Run the test suite:

```bash
# Run all research agent tests
uv run pytest tests/test_research_agent.py -v

# Run with coverage
uv run pytest tests/test_research_agent.py --cov=src.services.research
```

## Architecture

The research agent follows the project's architecture patterns:

- **Protocol-Based Services**: Uses `ResearchServiceProtocol` for clean interfaces
- **Configuration Management**: Centralized config via `ResearchConfig`
- **Error Handling**: Comprehensive error handling with custom exceptions
- **Testing**: Unit tests with mocks and integration tests
- **Modular Design**: Separate concerns for API, service, and UI layers

## Contributing

When contributing to the research agent:

1. **Test First**: Write unit tests before implementing features
2. **Follow Patterns**: Use existing service patterns and protocols
3. **Keep Modular**: Maintain separation between UI, service, and API layers
4. **Document**: Update this documentation for new features
5. **Type Hints**: Use proper type hints throughout

## License

This research agent is part of the Trax project and follows the same licensing terms.
