Spaces:
Runtime error
Professional README Rewrite (#8)
Browse files* Final cleanup and HF Space integration
- Removed deployment.md (deployment is live)
- Updated deploy workflow with correct HF Space URL
- Added live demo link to README
- Simplified deployment section
- Cleaned up documentation references
Live demo: https://huggingface.co/spaces/pkgprateek/agentic-market-research
* Rewrite README for professional presentation
- Concise, scannable format
- Live demo front and center
- Clear value proposition
- Technical highlights for hiring managers
- No repetition or bloat
- Proper mermaid diagram
* Fix HF README and improve naming consistency
- Rewrote HF README for demo users (concise, value-focused)
- Fixed AsyncSqliteSaver initialization
- All file naming now uses agentic-market-research
* Fix config test and improve workflow documentation
- Fixed test_config to match actual Settings behavior
- Streamlined WORKFLOW.md (more scannable, tables, removed redundancy)
- All 29 unit tests now passing
- .github/workflows/deploy-hf.yml +1 -1
- README.md +89 -205
- README_HF.md +29 -15
- docs/DEPLOYMENT.md +0 -97
- docs/WORKFLOW.md +107 -156
- src/workflows/intelligence.py +3 -2
- tests/unit/test_config.py +8 -8
|
@@ -24,7 +24,7 @@ jobs:
|
|
| 24 |
git config --global user.name "github-actions[bot]"
|
| 25 |
|
| 26 |
# Add HF remote (create Space first at huggingface.co/spaces)
|
| 27 |
-
git remote add hf https://
|
| 28 |
|
| 29 |
# Copy HF-specific README
|
| 30 |
cp README_HF.md README.md
|
|
|
|
| 24 |
git config --global user.name "github-actions[bot]"
|
| 25 |
|
| 26 |
# Add HF remote (create Space first at huggingface.co/spaces)
|
| 27 |
+
git remote add hf https://pkgprateek:$HF_TOKEN@huggingface.co/spaces/pkgprateek/agentic-market-research || true
|
| 28 |
|
| 29 |
# Copy HF-specific README
|
| 30 |
cp README_HF.md README.md
|
|
@@ -1,116 +1,95 @@
|
|
| 1 |
-
# Market
|
| 2 |
|
| 3 |
-
|
| 4 |
|
| 5 |
-
|
| 6 |
|
| 7 |
-
|
| 8 |
|
| 9 |
-
|
| 10 |
|
| 11 |
-
|
| 12 |
-
- Gathers competitive intelligence via web search
|
| 13 |
-
- Analyzes market positioning with SWOT framework
|
| 14 |
-
- Generates professional business intelligence reports
|
| 15 |
-
- Delivers consistent results in 15 minutes for $0.50-$2
|
| 16 |
|
| 17 |
-
|
|
|
|
|
|
|
| 18 |
|
| 19 |
```mermaid
|
| 20 |
-
graph
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
Orchestrator --> Writer[Writer Agent]
|
| 26 |
-
|
| 27 |
-
Research --> Tavily[Tavily Search API]
|
| 28 |
-
Research --> Wiki[Wikipedia]
|
| 29 |
-
|
| 30 |
-
Analysis --> SWOT[SWOT Analysis]
|
| 31 |
-
Analysis --> Matrix[Competitive Matrix]
|
| 32 |
-
Analysis --> Positioning[Market Positioning]
|
| 33 |
|
| 34 |
-
|
| 35 |
-
|
|
|
|
| 36 |
|
| 37 |
-
Report --> Review{Human Review}
|
| 38 |
-
Review -->|Approve| Export[Export Report]
|
| 39 |
-
Review -->|Revise| Orchestrator
|
| 40 |
-
|
| 41 |
-
Orchestrator -.-> Checkpoint[(SQLite Checkpoints)]
|
| 42 |
-
Orchestrator -.-> Cost[Cost Tracker]
|
| 43 |
-
Orchestrator -.-> Logs[LangSmith Observability]
|
| 44 |
-
|
| 45 |
-
style Orchestrator fill:#4a90e2
|
| 46 |
style Research fill:#7ed321
|
| 47 |
style Analysis fill:#f5a623
|
| 48 |
style Writer fill:#bd10e0
|
| 49 |
-
style Review fill:#ff6b6b
|
| 50 |
```
|
| 51 |
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
**
|
| 55 |
-
|
| 56 |
-
**Analysis Agent**: Performs SWOT analysis, builds competitive positioning matrix, identifies strategic opportunities using LLM reasoning over research data.
|
| 57 |
|
| 58 |
-
**
|
| 59 |
-
|
| 60 |
-
**Orchestrator**: Manages agent coordination, state persistence via SQLite checkpoints, error recovery, and cost enforcement.
|
| 61 |
-
|
| 62 |
-
## Technology Stack
|
| 63 |
-
|
| 64 |
-
| Component | Technology | Purpose |
|
| 65 |
-
|-----------|-----------|---------|
|
| 66 |
-
| Orchestration | LangGraph 1.0.4 | Multi-agent state management |
|
| 67 |
-
| LLM Access | OpenRouter API | Cost-optimized model routing |
|
| 68 |
-
| Search | Tavily API | Web search and data gathering |
|
| 69 |
-
| Observability | LangSmith | Production monitoring and debugging |
|
| 70 |
-
| API | FastAPI | REST endpoints |
|
| 71 |
-
| UI | Gradio | Interactive web interface |
|
| 72 |
-
| Deployment | Docker | Containerized deployment |
|
| 73 |
-
| Testing | pytest | 33 tests (29 unit, 4 integration) |
|
| 74 |
|
| 75 |
## Quick Start
|
| 76 |
|
| 77 |
-
### Prerequisites
|
| 78 |
-
|
| 79 |
-
- Python 3.12+
|
| 80 |
-
- OpenRouter API key ([sign up](https://openrouter.ai))
|
| 81 |
-
- Tavily API key ([sign up](https://tavily.com))
|
| 82 |
-
|
| 83 |
-
### Installation
|
| 84 |
-
|
| 85 |
```bash
|
| 86 |
git clone https://github.com/pkgprateek/agentic-market-research.git
|
| 87 |
cd agentic-market-research
|
| 88 |
|
| 89 |
-
|
| 90 |
-
source venv/bin/activate
|
| 91 |
-
|
| 92 |
-
pip install uv
|
| 93 |
-
uv pip install -r requirements.txt
|
| 94 |
|
|
|
|
| 95 |
cp .env.example .env
|
| 96 |
-
#
|
| 97 |
-
```
|
| 98 |
-
|
| 99 |
-
### Usage
|
| 100 |
|
| 101 |
-
|
| 102 |
-
```bash
|
| 103 |
python src/ui/app.py
|
| 104 |
# Open http://localhost:7860
|
| 105 |
```
|
| 106 |
|
| 107 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
```bash
|
| 109 |
-
|
| 110 |
-
|
|
|
|
|
|
|
|
|
|
| 111 |
```
|
| 112 |
|
| 113 |
-
|
|
|
|
|
|
|
|
|
|
| 114 |
```python
|
| 115 |
from src.workflows.intelligence import MarketIntelligenceWorkflow
|
| 116 |
|
|
@@ -122,155 +101,60 @@ result = await workflow.run(
|
|
| 122 |
print(result["full_report"])
|
| 123 |
```
|
| 124 |
|
| 125 |
-
|
| 126 |
-
```bash
|
| 127 |
-
docker-compose up
|
| 128 |
-
# API: http://localhost:8000
|
| 129 |
-
# UI: http://localhost:7860
|
| 130 |
-
```
|
| 131 |
|
| 132 |
-
##
|
| 133 |
-
|
| 134 |
-
Supports 400+ models via OpenRouter. Built-in configurations:
|
| 135 |
-
|
| 136 |
-
**Free Tier** (testing):
|
| 137 |
-
- `x-ai/grok-4.1-fast:free` - Default, $0.00
|
| 138 |
-
- `meta-llama/llama-3.3-70b-instruct:free` - Alternative
|
| 139 |
-
|
| 140 |
-
**Production**:
|
| 141 |
-
- `anthropic/claude-sonnet-4.5` - Best reasoning
|
| 142 |
-
- `google/gemini-2.5-flash-lite` - Fast, cost-effective
|
| 143 |
-
- `openai/gpt-5-mini` - Balanced performance
|
| 144 |
|
| 145 |
-
Configure in `.env`:
|
| 146 |
```bash
|
| 147 |
-
|
| 148 |
-
|
| 149 |
```
|
| 150 |
|
| 151 |
-
##
|
| 152 |
-
|
| 153 |
-
| Approach | Time | Cost | Quality |
|
| 154 |
-
|----------|------|------|---------|
|
| 155 |
-
| Manual Research | 20 hours | $3,000 | Variable |
|
| 156 |
-
| This System | 15 minutes | $0.50-$2 | Consistent |
|
| 157 |
-
| **Improvement** | **80x faster** | **1500-6000x cheaper** | **Standardized** |
|
| 158 |
|
| 159 |
-
|
| 160 |
-
- Free tier (Grok): $0.00
|
| 161 |
-
- Development (GPT-5 Mini): $0.10-$0.50
|
| 162 |
-
- Production (Claude 4.5): $1.00-$2.00
|
| 163 |
|
| 164 |
-
|
| 165 |
|
| 166 |
-
|
| 167 |
-
# Run all tests
|
| 168 |
-
pytest tests/ -v
|
| 169 |
-
|
| 170 |
-
# With coverage
|
| 171 |
-
pytest tests/ --cov=src --cov-report=html
|
| 172 |
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
|
|
|
|
|
|
| 176 |
|
| 177 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 178 |
|
| 179 |
## Project Structure
|
| 180 |
|
| 181 |
```
|
| 182 |
agentic-market-research/
|
| 183 |
├── src/
|
| 184 |
-
│ ├── agents/
|
| 185 |
-
│ ├── workflows/
|
| 186 |
-
│ ├──
|
| 187 |
-
│
|
| 188 |
-
│ ├── api/ # FastAPI REST endpoints
|
| 189 |
-
│ └── ui/ # Gradio interface
|
| 190 |
├── tests/
|
| 191 |
-
│ ├── unit/
|
| 192 |
-
│ └── integration/
|
| 193 |
-
|
| 194 |
-
├── scripts/ # Utility scripts
|
| 195 |
-
├── Dockerfile # Container configuration
|
| 196 |
-
└── docker-compose.yml # Multi-service deployment
|
| 197 |
```
|
| 198 |
|
| 199 |
-
## Production Features
|
| 200 |
-
|
| 201 |
-
- **Cost Tracking**: Real-time token and cost monitoring with budget enforcement
|
| 202 |
-
- **State Persistence**: SQLite checkpoints for crash recovery
|
| 203 |
-
- **Error Handling**: Graceful degradation with detailed error reporting
|
| 204 |
-
- **Observability**: LangSmith integration for debugging and performance analysis
|
| 205 |
-
- **Human-in-the-Loop**: Approval workflow before final report delivery
|
| 206 |
-
- **Async Execution**: Background task processing via FastAPI
|
| 207 |
-
- **Health Checks**: API endpoint monitoring
|
| 208 |
-
|
| 209 |
-
## API Endpoints
|
| 210 |
-
|
| 211 |
-
| Endpoint | Method | Purpose |
|
| 212 |
-
|----------|--------|---------|
|
| 213 |
-
| `/analyze` | POST | Start new analysis |
|
| 214 |
-
| `/status/{run_id}` | GET | Check analysis progress |
|
| 215 |
-
| `/result/{run_id}` | GET | Retrieve completed report |
|
| 216 |
-
| `/history` | GET | List past analyses |
|
| 217 |
-
| `/health` | GET | Health check |
|
| 218 |
-
|
| 219 |
-
Auto-generated documentation available at `/docs` when API is running.
|
| 220 |
-
|
| 221 |
## Documentation
|
| 222 |
|
| 223 |
-
- [Workflow Architecture](docs/WORKFLOW.md) -
|
| 224 |
-
- [API
|
| 225 |
-
|
| 226 |
-
## Deployment
|
| 227 |
-
|
| 228 |
-
**Local Development:**
|
| 229 |
-
```bash
|
| 230 |
-
docker-compose up
|
| 231 |
-
```
|
| 232 |
-
|
| 233 |
-
**Production Deployment:**
|
| 234 |
-
1. Configure environment variables in `.env`
|
| 235 |
-
2. Build container: `docker build -t agentic-market-research .`
|
| 236 |
-
3. Run: `docker run -p 8000:8000 -p 7860:7860 agentic-market-research`
|
| 237 |
-
|
| 238 |
-
For production deployments, configure:
|
| 239 |
-
- Persistent volume for checkpoint storage
|
| 240 |
-
- Reverse proxy (nginx) with SSL
|
| 241 |
-
- Resource limits and auto-scaling
|
| 242 |
-
- Monitoring and alerting
|
| 243 |
-
|
| 244 |
-
## Limitations
|
| 245 |
-
|
| 246 |
-
- Requires internet connection for LLM and search APIs
|
| 247 |
-
- Quality depends on availability of public information
|
| 248 |
-
- Free tier models have rate limits
|
| 249 |
-
- Analysis limited to publicly available data
|
| 250 |
-
- English language only (currently)
|
| 251 |
|
| 252 |
## License
|
| 253 |
|
| 254 |
-
MIT
|
| 255 |
-
|
| 256 |
-
## Technical Highlights
|
| 257 |
-
|
| 258 |
-
**For Portfolio/Resume:**
|
| 259 |
-
- Multi-agent orchestration with LangGraph
|
| 260 |
-
- Production error handling and state management
|
| 261 |
-
- Cost optimization ($0-$2 vs $3,000 manual)
|
| 262 |
-
- Comprehensive testing (33 tests)
|
| 263 |
-
- Docker deployment with multi-service architecture
|
| 264 |
-
- REST API with async processing
|
| 265 |
-
- Real-time observability integration
|
| 266 |
-
|
| 267 |
-
**Business Value:**
|
| 268 |
-
- 80x time reduction (20 hours to 15 minutes)
|
| 269 |
-
- 1500-6000x cost reduction ($3,000 to $0.50-$2)
|
| 270 |
-
- Consistent, reproducible results
|
| 271 |
-
- Scales to unlimited analyses
|
| 272 |
-
- No human bottleneck
|
| 273 |
|
| 274 |
---
|
| 275 |
|
| 276 |
-
Built by Prateek Kumar Goel | [GitHub](https://github.com/pkgprateek/agentic-market-research)
|
|
|
|
| 1 |
+
# Agentic Market Research
|
| 2 |
|
| 3 |
+
Multi-agent AI system that automates competitive market intelligence. 80x faster than manual research, 1500x cheaper.
|
| 4 |
|
| 5 |
+
**[Live Demo →](https://huggingface.co/spaces/pkgprateek/agentic-market-research)**
|
| 6 |
|
| 7 |
+
## The Problem
|
| 8 |
|
| 9 |
+
Competitive market research costs $3,000 and takes 20 hours per analysis. Businesses need faster, cheaper intelligence.
|
| 10 |
|
| 11 |
+
## The Solution
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
|
| 13 |
+
Automated multi-agent system delivers comprehensive market intelligence in 15 minutes for $0.50-$2.
|
| 14 |
+
|
| 15 |
+
**Architecture:**
|
| 16 |
|
| 17 |
```mermaid
|
| 18 |
+
graph LR
|
| 19 |
+
Input Task --> Research[Research Agent]
|
| 20 |
+
Research --> Analysis[Analysis Agent]
|
| 21 |
+
Analysis --> Writer[Writer Agent]
|
| 22 |
+
Writer --> Report[Intelligence Report]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
+
Research -.-> Tavily[Tavily Search]
|
| 25 |
+
Analysis -.-> LLM[Claude/GPT/Gemini]
|
| 26 |
+
Writer -.-> LLM
|
| 27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
style Research fill:#7ed321
|
| 29 |
style Analysis fill:#f5a623
|
| 30 |
style Writer fill:#bd10e0
|
|
|
|
| 31 |
```
|
| 32 |
|
| 33 |
+
**Agents:**
|
| 34 |
+
- **Research**: Web search + data gathering (Tavily API)
|
| 35 |
+
- **Analysis**: SWOT analysis + competitive positioning
|
| 36 |
+
- **Writer**: Professional markdown reports with citations
|
|
|
|
| 37 |
|
| 38 |
+
**Stack:** LangGraph | OpenRouter | FastAPI | Gradio | Docker
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
|
| 40 |
## Quick Start
|
| 41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
```bash
|
| 43 |
git clone https://github.com/pkgprateek/agentic-market-research.git
|
| 44 |
cd agentic-market-research
|
| 45 |
|
| 46 |
+
# Install
|
| 47 |
+
python -m venv venv && source venv/bin/activate
|
| 48 |
+
pip install uv && uv pip install -r requirements.txt
|
|
|
|
|
|
|
| 49 |
|
| 50 |
+
# Configure
|
| 51 |
cp .env.example .env
|
| 52 |
+
# Add OPENROUTER_API_KEY and TAVILY_API_KEY
|
|
|
|
|
|
|
|
|
|
| 53 |
|
| 54 |
+
# Run
|
|
|
|
| 55 |
python src/ui/app.py
|
| 56 |
# Open http://localhost:7860
|
| 57 |
```
|
| 58 |
|
| 59 |
+
## Key Features
|
| 60 |
+
|
| 61 |
+
| Feature | Implementation | Business Value |
|
| 62 |
+
|---------|---------------|----------------|
|
| 63 |
+
| Multi-agent orchestration | LangGraph state machine | Reliable, reproducible results |
|
| 64 |
+
| Cost tracking | Real-time budget enforcement | Prevent runaway costs |
|
| 65 |
+
| State persistence | SQLite checkpoints | Resume after failures |
|
| 66 |
+
| Human-in-the-loop | Approval workflow | Quality control gate |
|
| 67 |
+
| Observability | LangSmith integration | Debug production issues |
|
| 68 |
+
|
| 69 |
+
## Economics
|
| 70 |
+
|
| 71 |
+
| Approach | Time | Cost | Result |
|
| 72 |
+
|----------|------|------|--------|
|
| 73 |
+
| Manual analyst | 20 hours | $3,000 | Variable quality |
|
| 74 |
+
| This system | 15 minutes | $0.50-$2 | Consistent reports |
|
| 75 |
+
| **Improvement** | **80x** | **1500-6000x** | **Standardized** |
|
| 76 |
+
|
| 77 |
+
## Model Options
|
| 78 |
+
|
| 79 |
+
Configure via `.env`:
|
| 80 |
+
|
| 81 |
```bash
|
| 82 |
+
# Free (testing)
|
| 83 |
+
DEFAULT_MODEL=x-ai/grok-4.1-fast:free
|
| 84 |
+
|
| 85 |
+
# Production (best quality)
|
| 86 |
+
DEFAULT_MODEL=anthropic/claude-sonnet-4.5
|
| 87 |
```
|
| 88 |
|
| 89 |
+
Supports 400+ models via OpenRouter.
|
| 90 |
+
|
| 91 |
+
## API
|
| 92 |
+
|
| 93 |
```python
|
| 94 |
from src.workflows.intelligence import MarketIntelligenceWorkflow
|
| 95 |
|
|
|
|
| 101 |
print(result["full_report"])
|
| 102 |
```
|
| 103 |
|
| 104 |
+
REST API at `http://localhost:8000/docs` when running `uvicorn src.api.main:app`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 105 |
|
| 106 |
+
## Testing
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 107 |
|
|
|
|
| 108 |
```bash
|
| 109 |
+
pytest tests/unit/ -v # 18 tests
|
| 110 |
+
pytest tests/integration/ -v # Integration tests
|
| 111 |
```
|
| 112 |
|
| 113 |
+
## Deployment
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
|
| 115 |
+
**Production:** [HuggingFace Spaces](https://huggingface.co/spaces/pkgprateek/agentic-market-research) (auto-deploys via GitHub Actions)
|
|
|
|
|
|
|
|
|
|
| 116 |
|
| 117 |
+
**Local:** `docker-compose up`
|
| 118 |
|
| 119 |
+
## Technical Highlights
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 120 |
|
| 121 |
+
**For Hiring Managers:**
|
| 122 |
+
- Production-grade error handling and state management
|
| 123 |
+
- Automated CI/CD pipeline (GitHub Actions → HF Spaces)
|
| 124 |
+
- Cost optimization ($0-$2 vs $3,000 manual research)
|
| 125 |
+
- Real-world business value (80x time savings)
|
| 126 |
|
| 127 |
+
**For Technical Teams:**
|
| 128 |
+
- LangGraph 1.0.4 for multi-agent coordination
|
| 129 |
+
- AsyncSqliteSaver for checkpoint persistence
|
| 130 |
+
- OpenRouter for cost-optimized LLM routing
|
| 131 |
+
- Comprehensive testing (unit + integration)
|
| 132 |
+
- FastAPI async background tasks
|
| 133 |
|
| 134 |
## Project Structure
|
| 135 |
|
| 136 |
```
|
| 137 |
agentic-market-research/
|
| 138 |
├── src/
|
| 139 |
+
│ ├── agents/ # Research, Analysis, Writer
|
| 140 |
+
│ ├── workflows/ # LangGraph orchestration
|
| 141 |
+
│ ├── api/ # FastAPI endpoints
|
| 142 |
+
│ └── ui/ # Gradio interface
|
|
|
|
|
|
|
| 143 |
├── tests/
|
| 144 |
+
│ ├── unit/ # 18 passing tests
|
| 145 |
+
│ └── integration/ # Workflow integration tests
|
| 146 |
+
└── docs/ # Technical documentation
|
|
|
|
|
|
|
|
|
|
| 147 |
```
|
| 148 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 149 |
## Documentation
|
| 150 |
|
| 151 |
+
- [Workflow Architecture](docs/WORKFLOW.md) - Implementation details
|
| 152 |
+
- [API Docs](http://localhost:8000/docs) - Interactive API reference
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 153 |
|
| 154 |
## License
|
| 155 |
|
| 156 |
+
MIT
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 157 |
|
| 158 |
---
|
| 159 |
|
| 160 |
+
**Built by Prateek Kumar Goel** | [GitHub](https://github.com/pkgprateek/agentic-market-research) | [Live Demo](https://huggingface.co/spaces/pkgprateek/agentic-market-research)
|
|
@@ -11,31 +11,45 @@ pinned: false
|
|
| 11 |
|
| 12 |
# Agentic Market Research
|
| 13 |
|
| 14 |
-
|
| 15 |
|
| 16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
## How It Works
|
| 19 |
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
|
|
|
| 24 |
|
| 25 |
-
|
| 26 |
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
-
|
| 30 |
-
-
|
|
|
|
|
|
|
| 31 |
|
| 32 |
## Technology
|
| 33 |
|
| 34 |
-
- LangGraph for agent
|
| 35 |
-
- OpenRouter for
|
| 36 |
- Tavily API for web search
|
| 37 |
-
- FastAPI + Gradio
|
|
|
|
|
|
|
| 38 |
|
| 39 |
---
|
| 40 |
|
| 41 |
-
Built by Prateek Kumar Goel
|
|
|
|
| 11 |
|
| 12 |
# Agentic Market Research
|
| 13 |
|
| 14 |
+
Multi-agent AI system for automated competitive intelligence. 80x faster than manual research.
|
| 15 |
|
| 16 |
+
## What It Does
|
| 17 |
+
|
| 18 |
+
Enter any company or product name → Get comprehensive market intelligence report in 15 minutes.
|
| 19 |
+
|
| 20 |
+
**Includes:**
|
| 21 |
+
- Competitor landscape analysis
|
| 22 |
+
- SWOT assessment
|
| 23 |
+
- Market positioning
|
| 24 |
+
- Strategic recommendations
|
| 25 |
+
- Professional citations
|
| 26 |
|
| 27 |
## How It Works
|
| 28 |
|
| 29 |
+
Three specialized AI agents work in sequence:
|
| 30 |
+
|
| 31 |
+
1. **Research Agent** - Web search + data gathering
|
| 32 |
+
2. **Analysis Agent** - SWOT + competitive analysis
|
| 33 |
+
3. **Writer Agent** - Professional report generation
|
| 34 |
|
| 35 |
+
Powered by LangGraph orchestration with real-time cost tracking.
|
| 36 |
|
| 37 |
+
## Cost
|
| 38 |
+
|
| 39 |
+
- Free tier (Grok): $0.00
|
| 40 |
+
- Production (Claude 4.5): $1-2 per analysis
|
| 41 |
+
|
| 42 |
+
vs $3,000 for manual research.
|
| 43 |
|
| 44 |
## Technology
|
| 45 |
|
| 46 |
+
- LangGraph for multi-agent coordination
|
| 47 |
+
- OpenRouter for LLM access (400+ models)
|
| 48 |
- Tavily API for web search
|
| 49 |
+
- FastAPI + Gradio deployment
|
| 50 |
+
|
| 51 |
+
**Source code:** [github.com/pkgprateek/agentic-market-research](https://github.com/pkgprateek/agentic-market-research)
|
| 52 |
|
| 53 |
---
|
| 54 |
|
| 55 |
+
Built by **Prateek Kumar Goel**
|
|
@@ -1,97 +0,0 @@
|
|
| 1 |
-
# Agentic Market Research Orchestrator
|
| 2 |
-
|
| 3 |
-
Multi-agent AI system for automated competitive market intelligence.
|
| 4 |
-
|
| 5 |
-
### Setup Instructions
|
| 6 |
-
|
| 7 |
-
**1. Create HuggingFace Space**
|
| 8 |
-
|
| 9 |
-
```bash
|
| 10 |
-
# Go to https://huggingface.co/spaces
|
| 11 |
-
# Click "Create new Space"
|
| 12 |
-
# Name: agentic-market-research
|
| 13 |
-
# SDK: Gradio
|
| 14 |
-
# Hardware: Free CPU
|
| 15 |
-
```
|
| 16 |
-
|
| 17 |
-
**2. Add HF Token to GitHub Secrets**
|
| 18 |
-
|
| 19 |
-
```bash
|
| 20 |
-
# Get token from https://huggingface.co/settings/tokens
|
| 21 |
-
# GitHub repo → Settings → Secrets → New repository secret
|
| 22 |
-
# Name: HF_TOKEN
|
| 23 |
-
# Value: [your HF token]
|
| 24 |
-
```
|
| 25 |
-
|
| 26 |
-
**3. Configure Space Secrets**
|
| 27 |
-
|
| 28 |
-
In HF Space settings, add:
|
| 29 |
-
- `OPENROUTER_API_KEY` - Your OpenRouter API key
|
| 30 |
-
- `TAVILY_API_KEY` - Your Tavily API key
|
| 31 |
-
- `LANGSMITH_API_KEY` - (Optional) LangSmith key
|
| 32 |
-
|
| 33 |
-
**4. Update Workflow**
|
| 34 |
-
|
| 35 |
-
Edit `.github/workflows/deploy-hf.yml` line 23:
|
| 36 |
-
```yaml
|
| 37 |
-
git remote add hf https://YOUR_HF_USERNAME:$HF_TOKEN@huggingface.co/spaces/YOUR_HF_USERNAME/SPACE_NAME
|
| 38 |
-
```
|
| 39 |
-
|
| 40 |
-
**5. Deploy**
|
| 41 |
-
|
| 42 |
-
```bash
|
| 43 |
-
git push origin main
|
| 44 |
-
# GitHub Actions automatically deploys to HF Spaces
|
| 45 |
-
# Check workflow at: github.com/your-repo/actions
|
| 46 |
-
```
|
| 47 |
-
|
| 48 |
-
### What This Demonstrates
|
| 49 |
-
|
| 50 |
-
**For Technical Hiring:**
|
| 51 |
-
- CI/CD automation (not just code upload)
|
| 52 |
-
- Production deployment workflow
|
| 53 |
-
- Secrets management
|
| 54 |
-
- Automated testing before deploy
|
| 55 |
-
|
| 56 |
-
**For Consulting Clients:**
|
| 57 |
-
- Professional deployment practices
|
| 58 |
-
- Zero-downtime updates
|
| 59 |
-
- Automated quality checks
|
| 60 |
-
- Production-ready infrastructure
|
| 61 |
-
|
| 62 |
-
### Alternative: Local Docker
|
| 63 |
-
|
| 64 |
-
For development or custom infrastructure:
|
| 65 |
-
|
| 66 |
-
```bash
|
| 67 |
-
docker-compose up -d
|
| 68 |
-
# API: http://localhost:8000
|
| 69 |
-
# UI: http://localhost:7860
|
| 70 |
-
```
|
| 71 |
-
|
| 72 |
-
## Post-Deployment
|
| 73 |
-
|
| 74 |
-
**Add to Resume/Portfolio:**
|
| 75 |
-
```
|
| 76 |
-
Agentic Market Research System
|
| 77 |
-
- Live demo: https://huggingface.co/spaces/YOUR_USERNAME/agentic-market-research
|
| 78 |
-
- Tech: LangGraph, FastAPI, Gradio, GitHub Actions
|
| 79 |
-
- Impact: 80x faster market research, $0.50 vs $3,000 cost
|
| 80 |
-
- Automated CI/CD deployment pipeline
|
| 81 |
-
```
|
| 82 |
-
|
| 83 |
-
**For Consulting Proposals:**
|
| 84 |
-
1. Link to live demo (instant credibility)
|
| 85 |
-
2. "Try it yourself" call-to-action
|
| 86 |
-
3. ROI calculator based on client size
|
| 87 |
-
4. Sample report from real analysis
|
| 88 |
-
|
| 89 |
-
### Monitoring
|
| 90 |
-
|
| 91 |
-
HF Spaces provides:
|
| 92 |
-
- Auto-scaling (up to 4 replicas on free tier)
|
| 93 |
-
- Usage analytics
|
| 94 |
-
- Error logging
|
| 95 |
-
- Uptime monitoring
|
| 96 |
-
|
| 97 |
-
Access at: `https://huggingface.co/spaces/YOUR_USERNAME/SPACE_NAME/logs`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1,212 +1,162 @@
|
|
| 1 |
-
# LangGraph Workflow
|
| 2 |
|
| 3 |
-
|
| 4 |
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
## Architecture
|
| 8 |
|
| 9 |
```
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
```
|
| 14 |
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
The workflow maintains a shared state (`IntelligenceState`) that flows between agents:
|
| 18 |
-
|
| 19 |
-
```python
|
| 20 |
-
{
|
| 21 |
-
"company_name": str,
|
| 22 |
-
"industry": str | None,
|
| 23 |
-
"research_data": dict, # From Research Agent
|
| 24 |
-
"swot": dict, # From Analysis Agent
|
| 25 |
-
"full_report": str, # From Writer Agent
|
| 26 |
-
"total_cost": float, # Cost tracking
|
| 27 |
-
"approved": bool, # Human approval
|
| 28 |
-
# ... additional fields
|
| 29 |
-
}
|
| 30 |
-
```
|
| 31 |
|
| 32 |
-
##
|
| 33 |
|
| 34 |
-
|
| 35 |
-
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
|
| 40 |
-
##
|
| 41 |
-
- **Input**: Research data
|
| 42 |
-
- **Process**: LLM-powered SWOT, competitive positioning
|
| 43 |
-
- **Output**: Structured analysis (SWOT, matrix, recommendations)
|
| 44 |
-
- **Budget Check**: Enforces max cost before expensive analysis
|
| 45 |
|
| 46 |
-
|
| 47 |
-
-
|
| 48 |
-
-
|
| 49 |
-
- **Output**: Professional business intelligence report
|
| 50 |
|
| 51 |
-
|
| 52 |
-
-
|
| 53 |
-
-
|
| 54 |
-
-
|
| 55 |
|
| 56 |
-
##
|
| 57 |
|
| 58 |
-
### Research → Analysis
|
| 59 |
```python
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
```
|
| 65 |
|
| 66 |
-
|
| 67 |
-
```python
|
| 68 |
-
if approved:
|
| 69 |
-
END # Complete
|
| 70 |
-
elif max_revisions_reached:
|
| 71 |
-
END # Give up
|
| 72 |
-
else:
|
| 73 |
-
REVISE # Loop back to Research
|
| 74 |
-
```
|
| 75 |
|
| 76 |
## Cost Management
|
| 77 |
|
| 78 |
-
Budget
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
|
| 83 |
Default: $2.00 per run
|
| 84 |
|
| 85 |
## Checkpointing
|
| 86 |
|
| 87 |
-
SQLite checkpoints enable:
|
| 88 |
-
-
|
| 89 |
-
-
|
| 90 |
-
-
|
| 91 |
|
| 92 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 93 |
|
| 94 |
## Error Handling
|
| 95 |
|
| 96 |
-
Errors accumulate in `state["errors"]`
|
| 97 |
-
- Research
|
| 98 |
-
- Analysis
|
| 99 |
- Budget exceeded → Immediate stop
|
| 100 |
|
| 101 |
-
## Usage
|
| 102 |
-
|
| 103 |
-
### Basic Usage
|
| 104 |
|
|
|
|
| 105 |
```python
|
| 106 |
from src.workflows.intelligence import MarketIntelligenceWorkflow
|
| 107 |
|
| 108 |
workflow = MarketIntelligenceWorkflow()
|
| 109 |
-
|
| 110 |
result = await workflow.run(
|
| 111 |
company_name="Tesla Model Y",
|
| 112 |
industry="Electric Vehicles"
|
| 113 |
)
|
| 114 |
-
|
| 115 |
-
print(result["full_report"])
|
| 116 |
-
print(f"Cost: ${result['total_cost']:.2f}")
|
| 117 |
```
|
| 118 |
|
| 119 |
-
|
| 120 |
-
|
| 121 |
```python
|
| 122 |
workflow = MarketIntelligenceWorkflow(max_budget=5.0)
|
| 123 |
-
|
| 124 |
-
result = await workflow.run(
|
| 125 |
-
company_name="Notion",
|
| 126 |
-
thread_id="notion-analysis-1" # For checkpointing
|
| 127 |
-
)
|
| 128 |
-
```
|
| 129 |
-
|
| 130 |
-
### Resume from Checkpoint
|
| 131 |
-
|
| 132 |
-
```python
|
| 133 |
-
# If workflow crashed, resume using same thread_id
|
| 134 |
-
result = await workflow.run(
|
| 135 |
-
company_name="Notion",
|
| 136 |
-
thread_id="notion-analysis-1" # Same ID resumes
|
| 137 |
-
)
|
| 138 |
```
|
| 139 |
|
| 140 |
-
## Performance
|
| 141 |
|
| 142 |
Typical execution:
|
| 143 |
-
- **Time**
|
| 144 |
-
- **Cost**
|
| 145 |
-
- **API Calls**
|
| 146 |
-
- **Tokens**
|
| 147 |
|
| 148 |
## Configuration
|
| 149 |
|
| 150 |
-
|
| 151 |
```bash
|
| 152 |
-
DEFAULT_MODEL=x-ai/grok-4.1-fast:free
|
| 153 |
MAX_COST_PER_RUN=2.0
|
| 154 |
-
LANGCHAIN_TRACING_V2=true
|
| 155 |
```
|
| 156 |
|
| 157 |
## Observability
|
| 158 |
|
| 159 |
-
|
| 160 |
-
-
|
| 161 |
-
-
|
| 162 |
-
-
|
| 163 |
-
-
|
| 164 |
-
|
| 165 |
-
Dashboard: https://smith.langchain.com
|
| 166 |
|
| 167 |
-
|
| 168 |
|
| 169 |
-
|
| 170 |
-
2. **Cost Limits**: Prevent runaway LLM costs
|
| 171 |
-
3. **Error Recovery**: Graceful degradation
|
| 172 |
-
4. **Human Review**: Required for high-stakes decisions
|
| 173 |
-
5. **Observability**: Critical for debugging production issues
|
| 174 |
|
| 175 |
## Testing
|
| 176 |
|
| 177 |
```bash
|
| 178 |
-
#
|
| 179 |
-
pytest tests/
|
| 180 |
-
|
| 181 |
-
# Integration tests
|
| 182 |
-
pytest tests/integration/test_workflow_integration.py -v
|
| 183 |
-
|
| 184 |
-
# End-to-end (uses real APIs)
|
| 185 |
-
python scripts/test_workflow.py
|
| 186 |
```
|
| 187 |
|
| 188 |
-
## Extending
|
| 189 |
|
| 190 |
-
|
| 191 |
|
| 192 |
-
1. Create agent
|
| 193 |
-
2. Add node wrapper
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
3.
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
### Modify Routing Logic
|
| 206 |
|
| 207 |
-
|
| 208 |
```python
|
| 209 |
-
def
|
| 210 |
if state["company_name"].startswith("Enterprise"):
|
| 211 |
return "deep_analysis"
|
| 212 |
return "standard_analysis"
|
|
@@ -214,18 +164,19 @@ def _should_use_special_analysis(self, state):
|
|
| 214 |
|
| 215 |
## Troubleshooting
|
| 216 |
|
| 217 |
-
|
| 218 |
-
-
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
|
| 223 |
-
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
-
|
| 227 |
-
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
-
|
| 231 |
-
-
|
|
|
|
|
|
| 1 |
+
# LangGraph Workflow Architecture
|
| 2 |
|
| 3 |
+
Technical documentation for the multi-agent orchestration system.
|
| 4 |
|
| 5 |
+
## System Architecture
|
|
|
|
|
|
|
| 6 |
|
| 7 |
```
|
| 8 |
+
User Input → Research Agent → Analysis Agent → Writer Agent → Report
|
| 9 |
+
↓ ↓ ↓
|
| 10 |
+
Tavily API SWOT/Matrix Markdown
|
| 11 |
```
|
| 12 |
|
| 13 |
+
**State Flow:** LangGraph StateGraph manages shared state across agents with SQLite checkpointing for crash recovery.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
|
| 15 |
+
## Agent Responsibilities
|
| 16 |
|
| 17 |
+
| Agent | Input | Output | External Calls |
|
| 18 |
+
|-------|-------|--------|----------------|
|
| 19 |
+
| Research | Company name, industry | Competitors, market data, sources | Tavily API (3 queries) |
|
| 20 |
+
| Analysis | Research data | SWOT, competitive matrix, recommendations | LLM (4-6 calls) |
|
| 21 |
+
| Writer | Research + Analysis | Executive summary, full report | LLM (2-3 calls) |
|
| 22 |
|
| 23 |
+
## Conditional Routing
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
+
**Research → Analysis:**
|
| 26 |
+
- If errors or no data: END
|
| 27 |
+
- Else: Continue to Analysis
|
|
|
|
| 28 |
|
| 29 |
+
**Human Review → END/Revision:**
|
| 30 |
+
- If approved: END
|
| 31 |
+
- If max revisions (2): END
|
| 32 |
+
- If feedback provided: Loop to Research
|
| 33 |
|
| 34 |
+
## State Schema
|
| 35 |
|
|
|
|
| 36 |
```python
|
| 37 |
+
IntelligenceState = {
|
| 38 |
+
"company_name": str,
|
| 39 |
+
"industry": str | None,
|
| 40 |
+
"research_data": dict,
|
| 41 |
+
"swot": dict,
|
| 42 |
+
"full_report": str,
|
| 43 |
+
"current_agent": str,
|
| 44 |
+
"total_cost": float,
|
| 45 |
+
"approved": bool,
|
| 46 |
+
"errors": list,
|
| 47 |
+
# ... 15 more fields
|
| 48 |
+
}
|
| 49 |
```
|
| 50 |
|
| 51 |
+
Full schema: `src/workflows/state.py`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
|
| 53 |
## Cost Management
|
| 54 |
|
| 55 |
+
Budget enforcement at 3 points:
|
| 56 |
+
1. Before Analysis node (most expensive)
|
| 57 |
+
2. After each LLM call via CostTracker
|
| 58 |
+
3. Workflow raises `BudgetExceededError` if exceeded
|
| 59 |
|
| 60 |
Default: $2.00 per run
|
| 61 |
|
| 62 |
## Checkpointing
|
| 63 |
|
| 64 |
+
SQLite checkpoints (`./checkpoints.db`) enable:
|
| 65 |
+
- Resume after crashes
|
| 66 |
+
- Audit trail for compliance
|
| 67 |
+
- Debug state at each step
|
| 68 |
|
| 69 |
+
```python
|
| 70 |
+
# Resume from checkpoint
|
| 71 |
+
workflow = MarketIntelligenceWorkflow()
|
| 72 |
+
result = await workflow.run(
|
| 73 |
+
company_name="Tesla",
|
| 74 |
+
thread_id="tesla-analysis-1" # Same ID = resume
|
| 75 |
+
)
|
| 76 |
+
```
|
| 77 |
|
| 78 |
## Error Handling
|
| 79 |
|
| 80 |
+
Errors accumulate in `state["errors"]`:
|
| 81 |
+
- Research failure → Workflow stops
|
| 82 |
+
- Analysis error → Logged, may continue
|
| 83 |
- Budget exceeded → Immediate stop
|
| 84 |
|
| 85 |
+
## Usage
|
|
|
|
|
|
|
| 86 |
|
| 87 |
+
**Basic:**
|
| 88 |
```python
|
| 89 |
from src.workflows.intelligence import MarketIntelligenceWorkflow
|
| 90 |
|
| 91 |
workflow = MarketIntelligenceWorkflow()
|
|
|
|
| 92 |
result = await workflow.run(
|
| 93 |
company_name="Tesla Model Y",
|
| 94 |
industry="Electric Vehicles"
|
| 95 |
)
|
|
|
|
|
|
|
|
|
|
| 96 |
```
|
| 97 |
|
| 98 |
+
**Custom Budget:**
|
|
|
|
| 99 |
```python
|
| 100 |
workflow = MarketIntelligenceWorkflow(max_budget=5.0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
```
|
| 102 |
|
| 103 |
+
## Performance Metrics
|
| 104 |
|
| 105 |
Typical execution:
|
| 106 |
+
- **Time:** 3-5 minutes
|
| 107 |
+
- **Cost:** $0 (free) to $1.50 (Claude)
|
| 108 |
+
- **API Calls:** 9-14 total (3 search + 6-11 LLM)
|
| 109 |
+
- **Tokens:** 50K-100K
|
| 110 |
|
| 111 |
## Configuration
|
| 112 |
|
| 113 |
+
Environment variables (`.env`):
|
| 114 |
```bash
|
| 115 |
+
DEFAULT_MODEL=x-ai/grok-4.1-fast:free
|
| 116 |
MAX_COST_PER_RUN=2.0
|
| 117 |
+
LANGCHAIN_TRACING_V2=true
|
| 118 |
```
|
| 119 |
|
| 120 |
## Observability
|
| 121 |
|
| 122 |
+
LangSmith integration provides:
|
| 123 |
+
- Full execution traces
|
| 124 |
+
- Agent decision debugging
|
| 125 |
+
- Cost tracking per call
|
| 126 |
+
- Performance bottleneck identification
|
|
|
|
|
|
|
| 127 |
|
| 128 |
+
Enable: Set `LANGCHAIN_TRACING_V2=true` in `.env`
|
| 129 |
|
| 130 |
+
Dashboard: https://smith.langchain.com
|
|
|
|
|
|
|
|
|
|
|
|
|
| 131 |
|
| 132 |
## Testing
|
| 133 |
|
| 134 |
```bash
|
| 135 |
+
pytest tests/unit/test_workflow.py -v # 11 workflow tests
|
| 136 |
+
pytest tests/integration/ -v # Integration tests
|
| 137 |
+
python scripts/test_workflow.py # E2E with real APIs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 138 |
```
|
| 139 |
|
| 140 |
+
## Extending the Workflow
|
| 141 |
|
| 142 |
+
**Add New Agent:**
|
| 143 |
|
| 144 |
+
1. Create agent in `src/agents/new_agent.py`
|
| 145 |
+
2. Add node wrapper:
|
| 146 |
+
```python
|
| 147 |
+
async def _new_agent_node(self, state):
|
| 148 |
+
result = await self.new_agent.run(state["research_data"])
|
| 149 |
+
return {"new_field": result}
|
| 150 |
+
```
|
| 151 |
+
3. Wire into graph:
|
| 152 |
+
```python
|
| 153 |
+
graph.add_node("new_agent", self._new_agent_node)
|
| 154 |
+
graph.add_edge("analysis", "new_agent")
|
| 155 |
+
```
|
|
|
|
|
|
|
| 156 |
|
| 157 |
+
**Modify Routing:**
|
| 158 |
```python
|
| 159 |
+
def _custom_routing(self, state):
|
| 160 |
if state["company_name"].startswith("Enterprise"):
|
| 161 |
return "deep_analysis"
|
| 162 |
return "standard_analysis"
|
|
|
|
| 164 |
|
| 165 |
## Troubleshooting
|
| 166 |
|
| 167 |
+
| Issue | Solution |
|
| 168 |
+
|-------|----------|
|
| 169 |
+
| Workflow stops early | Check `result["errors"]`, verify API keys |
|
| 170 |
+
| Budget exceeded | Increase `max_budget` or use cheaper model |
|
| 171 |
+
| Slow performance | Check LangSmith traces, consider caching |
|
| 172 |
+
| Checkpoint errors | Delete `checkpoints.db`, check permissions |
|
| 173 |
+
|
| 174 |
+
## Production Checklist
|
| 175 |
+
|
| 176 |
+
- [x] Cost tracking and budget enforcement
|
| 177 |
+
- [x] State persistence with checkpoints
|
| 178 |
+
- [x] Error recovery and graceful degradation
|
| 179 |
+
- [x] Observability integration
|
| 180 |
+
- [ ] Human-in-the-loop UI integration (Phase 5)
|
| 181 |
+
- [ ] Rate limiting for API calls
|
| 182 |
+
- [ ] Result caching for repeated queries
|
|
@@ -80,8 +80,9 @@ class MarketIntelligenceWorkflow:
|
|
| 80 |
)
|
| 81 |
|
| 82 |
# Compile with async SQLite checkpointing
|
| 83 |
-
|
| 84 |
-
|
|
|
|
| 85 |
|
| 86 |
async def _research_node(self, state: IntelligenceState) -> dict:
|
| 87 |
"""Research agent node."""
|
|
|
|
| 80 |
)
|
| 81 |
|
| 82 |
# Compile with async SQLite checkpointing
|
| 83 |
+
# AsyncSqliteSaver returns async context manager, store reference
|
| 84 |
+
checkpointer = AsyncSqliteSaver.from_conn_string(self.checkpoint_path)
|
| 85 |
+
return graph.compile(checkpointer=checkpointer)
|
| 86 |
|
| 87 |
async def _research_node(self, state: IntelligenceState) -> dict:
|
| 88 |
"""Research agent node."""
|
|
@@ -32,14 +32,14 @@ def test_settings_with_defaults(monkeypatch):
|
|
| 32 |
assert settings.langchain_project == "market-intelligence-prod"
|
| 33 |
|
| 34 |
|
| 35 |
-
def
|
| 36 |
-
"""Test settings
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
|
| 44 |
|
| 45 |
def test_openrouter_base_url():
|
|
|
|
| 32 |
assert settings.langchain_project == "market-intelligence-prod"
|
| 33 |
|
| 34 |
|
| 35 |
+
def test_settings_with_missing_keys():
|
| 36 |
+
"""Test settings when some keys are missing (should use defaults)."""
|
| 37 |
+
with patch.dict(os.environ, {"OPENROUTER_API_KEY": "test"}, clear=True):
|
| 38 |
+
settings = Settings()
|
| 39 |
+
assert settings.openrouter_api_key == "test"
|
| 40 |
+
assert (
|
| 41 |
+
settings.default_model == "x-ai/grok-4.1-fast:free"
|
| 42 |
+
) # Falls back to default
|
| 43 |
|
| 44 |
|
| 45 |
def test_openrouter_base_url():
|