Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

63 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Disha 🧭

Market intelligence and career optimization for India's AI/ML job landscape.

Disha is a multi-agent system that finds roles, scores them against a personal profile, analyzes companies, and can propose learning roadmaps β€” not generic chat, but structured matches with compensation fit, skill overlap, and explicit reasoning.

Portfolio: Disha owns job market fit only. Not ops (Ozyman), not FSRS (Scholar-Loop), not creative synthesis (IdeaForge). See docs/portfolio-product-boundaries.md.

Docs (start here)

Doc Purpose
docs/STATUS.md Handoff β€” what works, gaps, resume
docs/setup.md Env, backend/frontend run
docs/current_state.md Longer architecture audit
docs/portfolio-product-boundaries.md Disha vs Ozyman / Scholar-Loop / IdeaForge
AGENTS.md Guidance for coding agents

Python 3.12+ LangGraph FastAPI Next.js PostgreSQL License: MIT


What it does

Ask things like:

  • "Find Agentic AI and backend roles in Bangalore above 20 LPA"
  • "Should I apply to Razorpay or Swiggy given my skill set?"
  • "What LLMOps skills am I missing for Staff ML Engineer roles?"
  • "Suggest an ArXiv-backed learning roadmap for my skill gaps"

Typical flow:

Query β†’ Supervisor (keyword routing)
      β†’ Scraper (Greenhouse / Lever / Playwright + optional Gemini)
      β†’ Career Β· Financial Β· Learning specialists
      β†’ Guardrail β†’ Synthesize β†’ answer + structured jobs/recommendations

Current status

Component Status Notes
Supervisor orchestration βœ… Working Cyclic routing, max-6 iteration guard, guardrails
Career scoring βœ… Working Skill match %, LPA fit, location, experience
Financial analyst βœ… Working India-first private-market style scores
Learning companion βœ… Working Gemini gap analysis + phased roadmap
FastAPI + SSE βœ… Working /api/chat, /api/chat/stream with jobs + recs
Greenhouse + Lever tools βœ… Working Structured boards + normalizers
Query-aware board selection βœ… Working Company/topic/India filters choose boards; skip junk RSS on career queries
We Work Remotely + YC jobs βœ… Working RSS + Work-at-a-Startup page; 12h file cache + dedupe
Playwright + Gemini extract βœ… Working Only for named companies without a public board
Next.js chat UI βœ… Working SSE chat, job cards, recommendations, dark mode
pgvector schema πŸ”§ Scaffold Models + repos exist; not on the live chat path
Error recovery node βœ… Working Empty scrape β†’ broader fallback plan; then continue / synthesize
Resume evaluation tool πŸ”§ Partial Gemini tool exists; not wired into the graph

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                          SUPERVISOR AGENT                               β”‚
β”‚   Intent analysis Β· Deterministic routing Β· Iteration guard             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                               β”‚
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β–Ό                     β–Ό                      β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  SCRAPER     β”‚      β”‚  FINANCIAL     β”‚    β”‚  CAREER         β”‚
β”‚              β”‚      β”‚  ANALYST       β”‚    β”‚  STRATEGY       β”‚
β”‚ β€’ Greenhouse β”‚      β”‚ β€’ Growth       β”‚    β”‚ β€’ Skill match   β”‚
β”‚ β€’ Lever      β”‚      β”‚ β€’ Burn / runwayβ”‚    β”‚ β€’ LPA fit       β”‚
β”‚ β€’ Playwright β”‚      β”‚ β€’ ESOP / risk  β”‚    β”‚ β€’ India filter  β”‚
β”‚ β€’ Gemini ext β”‚      β”‚                β”‚    β”‚ β€’ Ranked recs   β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚                       β”‚                     β–Ό
       β”‚                       β”‚            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
       β”‚                       β”‚            β”‚  LEARNING       β”‚
       β”‚                       β”‚            β”‚  COMPANION      β”‚
       β”‚                       β”‚            β”‚ β€’ Gaps / ArXiv  β”‚
       β”‚                       β”‚            β”‚ β€’ Phase roadmap β”‚
       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                               β–Ό                     β–Ό
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚  GUARDRAIL β†’ SYNTHESIZE              β”‚
                    β”‚  Domain filter Β· Final answer        β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Routing is deterministic (no LLM in the control plane). Specialists run sequentially and return to the supervisor.

Layer Stack
Orchestration LangGraph, Pydantic v2
LLM Google Gemini (extraction, learning companion, resume tool)
Ingestion Greenhouse/Lever APIs, Playwright, RSS
API FastAPI, Server-Sent Events
UI Next.js 14, TypeScript, Tailwind, Shadcn/UI
Storage SQLAlchemy 2.0 async + pgvector (scaffold)
Config profiles/default.yaml, optional request preferences, .env

Quick start

Backend

git clone https://github.com/anmolsharma152/Disha.git
cd Disha

python -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# Optional: Postgres + pgvector
docker compose up -d

# .env
echo 'GEMINI_API_KEY="your_api_key_here"' >> .env

# CLI
python main.py "Find Agentic AI and backend roles in Bangalore"
python main.py "Should I invest in Indian AI companies?" --stream
python main.py "Analyze Razorpay financial health" --json

# API
uvicorn api.server:app --reload --host 0.0.0.0 --port 8000
curl -X POST http://localhost:8000/api/chat \
  -H "Content-Type: application/json" \
  -d '{"query": "Find Agentic AI roles in Bangalore above 20 LPA"}'

Interactive docs: http://localhost:8000/docs

Frontend

cd frontend
npm install
# optional: export NEXT_PUBLIC_API_URL=http://localhost:8000
npm run dev

Open http://localhost:3000. The UI streams agent status, job cards, career recommendations, and the final markdown answer from /api/chat/stream.


Example output

### 1. Senior AI/ML Engineer β€” Agentic Workflows @ Razorpay β€” 67.4/100 (MEDIUM)
- Location: Bangalore | Remote: Hybrid
- Base: β‚Ή55 LPA | Est. Total: β‚Ή73 LPA
- Skill Match: 68.4% (LangGraph, LangChain, Kubernetes, MLflow, vLLM)
- Gaps: multi-agent orchestration, model serving, drift detection
- Experience Fit: stretch
- Apply: razorpay.com/careers

Project structure

Disha/
β”œβ”€β”€ main.py                  # LangGraph compile, CLI, synthesize / error_recovery
β”œβ”€β”€ schemas.py               # JobOpening, CompanyMetrics, AgentState, …
β”œβ”€β”€ profiles/
β”‚   └── default.yaml         # Generic prefs (empty = no hard personal filters)
β”œβ”€β”€ agents/
β”‚   β”œβ”€β”€ supervisor_agent.py  # Routing + pre-synthesis guardrail
β”‚   β”œβ”€β”€ scraper_agent.py     # ATS + Playwright + optional Gemini extraction
β”‚   β”œβ”€β”€ career_agent.py      # Deterministic match scoring
β”‚   β”œβ”€β”€ financial_agent.py   # Company / investment style scores
β”‚   └── learning_agent.py    # Gemini learning roadmap
β”œβ”€β”€ tools/
β”‚   β”œβ”€β”€ scraper_tools.py     # RSS, Playwright, Greenhouse, Lever
β”‚   β”œβ”€β”€ board_selection.py   # Query β†’ ATS boards + keyword plan
β”‚   β”œβ”€β”€ job_normalizer.py    # ATS / WWR / YC payloads β†’ JobOpening
β”‚   β”œβ”€β”€ job_cache.py         # File cache + dedupe for job fetches
β”‚   β”œβ”€β”€ sources/             # WWR (RSS), YC Work-at-a-Startup, …
β”‚   └── career_tools.py      # Resume evaluation (Gemini)
β”œβ”€β”€ api/
β”‚   └── server.py            # FastAPI + SSE
β”œβ”€β”€ storage/
β”‚   └── db.py                # Async SQLAlchemy + pgvector models/repos
β”œβ”€β”€ frontend/                # Next.js chat UI (SSE, jobs, recommendations)
β”œβ”€β”€ docs/                    # Architecture, ADRs, roadmaps
└── docker-compose.yml       # pgvector Postgres

Configuration

Preferences & resume memory

Disha does not hardcode a personal dossier. Profile fields fill from:

  1. Resume upload (UI or POST /api/profile/resume) β†’ stored as single-user memory under data/
  2. Request preferences β€” optional per-query overrides
  3. profiles/default.yaml β€” empty product defaults when no memory
Preference Empty means
skills Skill match is neutral (not fake 0%)
target_cities No hard location drop
min_base_salary_inr Comp fit = unavailable (not auto β€œbelow”)
experience_years Experience fit = unknown

After you upload a resume, chat/search uses that memory automatically (user id default for v1).

# Upload resume
curl -X POST "http://localhost:8000/api/profile/resume?user_id=default" \
  -F "file=@/path/to/resume.pdf"

# Inspect memory
curl "http://localhost:8000/api/profile?user_id=default"

Environment:

GEMINI_API_KEY="your_api_key_here"
# optional: DISHA_DATA_DIR=/path/to/data   # where user_memory_*.json is stored
# optional frontend
NEXT_PUBLIC_API_URL="http://localhost:8000"

Roadmap

Done

  • Supervisor–specialist LangGraph graph with guardrails
  • FastAPI gateway + SSE (including structured jobs/recommendations)
  • Career + financial scoring engines (India-aware)
  • Greenhouse + Lever ingestion + job normalizers
  • Query-aware board selection (company match, topic keywords, India soft filter)
  • Playwright scraping + optional Gemini job extraction
  • Gemini learning companion
  • Next.js chat UI (streaming status, job list, recommendation cards)
  • Async Postgres + pgvector schema scaffold

Next

  • Expand live India ATS board coverage as more public boards are validated
  • Wire error_log β†’ error_recovery for real fallbacks
  • Persist jobs / use pgvector on the live path when needed
  • Richer job dashboard + learning roadmap UI
  • Deployment (e.g. Vercel + API host + managed Postgres)
  • Observability (tracing, cost), circuit breakers, cover letters

License

MIT

About

Disha: A production-grade, agentic Personal Intelligence platform. Features multi-agent LangGraph orchestration, India-market job intelligence, async PostgreSQL/pgvector storage, and a FastAPI/Next.js stack.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages