GPT Researcher shipped v3.7.0 on 2026-09-26 (PyPI gpt-researcher 0.16.x). The context filter now defaults to TypeSafe Jev, scoring passage usefulness for each sub-query instead of embedding similarity. On a 28-task replay with identical sources, kept-passage relevance is 73% for Jev vs 46% for embeddings (~59% relative lift). Without TYPESAFE_API_KEY it falls back to local BM25—no embedding provider required. Also requires Python 3.12+ and adds a retriever plugin entry point.

Key Takeaways

  • ✓Shipped: v3.7.0 / PyPI 0.16.1 — pip install -U gpt-researcher
  • ✓Official 28-task replay: Jev kept-passage relevance 73% vs embeddings 46% (~+59%) at similar cost
  • ✓CONTEXT_FILTER=auto uses Jev with TYPESAFE_API_KEY else BM25; Jev failures fall back to keyword
  • ✓Chunking: 50k page cap, 1k/100 overlap; keep ≤10 chunks (Jev/embeddings) or ≤25 (keyword) per sub-query
  • ✓Requires Python 3.12+; retrievers via gpt_researcher.retrievers entry points
🔬

In-Depth Technical Analysis

Core Background & Industry Pain Points

Autonomous research agents scrape dozens of pages per run, but writers only need a few useful passages. Embedding similarity conflates “looks alike” with “helps answer,” so noise reaches the writer and every pipeline must budget for an embedding provider.

Architecture Highlights & Internals

v3.7.0 / PyPI 0.16.x routes scraping through Context Filter in select_context(): 50k page cap, 1k/100 chunks, then Jev usefulness scoring when TYPESAFE_API_KEY is set, else local BM25. Jev failures fall back to keyword; report chat reuses the same filter. Retrievers can ship via the gpt_researcher.retrievers entry point.

Authoritative Benchmarks & Measured Scores

On an official 28-task replay with identical sources, Jev kept-passage relevance is 73% vs embeddings 46% (~59% relative lift) at similar cost. Keyword matched or beat embeddings without a cloud key. Reproduce via evals/context_filter/.

Developer Hands-on Guide

Requires Python 3.12+. pip install -U gpt-researcher. Set TYPESAFE_API_KEY for Jev (CONTEXT_FILTER=auto|jev); use CONTEXT_FILTER=embeddings for the old path. See the docs and release notes.