Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-27 00:33 UTC

assafelovic / gpt-researcher

An autonomous agent that conducts deep research on any data using any LLM providers

Python · TypeScriptApache-2.0★ 28,654 stars⑂ 3,866 forkssince May 2023View on GitHub ↗

assafelovic/gpt-researcher holds a health index of 81 out of 100, placing it in the Good band. It scores highest on Vitality (93/100) and lowest on Sustainability & Governance (67/100). It was last updated 8 days ago. A single contributor accounts for most of its recent work.

81
overall / 100
Good

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

81
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Assaf ElovicPersonal account
1,219 followers23 public repossince Jul 2015Tavily.com

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
PyPIgpt-researcher0.16.086,4711108 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

93Excellent · 22% of overall
How it's scored
28.8/36Push recency — last push 8 days ago
31.8/36Commit cadence — 46/52 weeks with commits
18/18Commit volume — 372 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 18 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year372
human_commit_share1
days_since_last_push8
active_weeks_last_year46

Release discipline

100Excellent
How it's scored
27/27Ships releases — 72 releases published
36/36Release recency — latest release 8 days ago
27/27Release cadence — a release every ~24 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count72
latest_release_tagv3.6.0
releases_from_tagsno
days_since_latest_release8
mean_days_between_releases24
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

89Excellent · 18% of overall
How it's scored
60/60Stars — 28,654 stars
25/25Forks — 3,866 forks
12.4/15Watchers — 168 watchers
Inputs used
forks3,866
stars28,654
watchers168
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

Community health

85Excellent
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (Apache-2.0)
18/18CONTRIBUTING guide
13.5/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductyes
has_pull_request_templateno
How it's scored
65.8/80Monthly downloads — 86,471 downloads/month across pypi
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesgpt-researcher
dependents
ecosystemspypi
total_downloads
monthly_downloads86,471
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

67Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
10.5/22.5Commit distribution — top contributor authored 53% of commits
13.5/13.5Contributor breadth — 98 contributors
10/10OpenSSF Scorecard: Contributors — project has 13 contributing companies or organizations
Inputs used
bus_factor1
contributors_sampled98
top_contributor_share0.534
How it's scored
43.9/46.8Issue resolution — 94% of issues closed
22.7/38.3PR acceptance — 571/961 decided PRs merged
1.5/15OpenSSF Scorecard: Code-Review — Found 1/9 approved changesets -- score normalized to 1
Inputs used
merged_prs571
open_issues44
closed_issues677
issue_closed_ratio0.939
closed_unmerged_prs390
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
22.2/25Owner reach — 1,219 followers of assafelovic
22.1/25Track record — 23 public repos, account ~11 yr old
Inputs used
followers1,219
owner_typeUser
is_verified
owner_loginassafelovic
public_repos23
account_age_days4,015
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on pypi
35/35Publish recency — latest publish 8 days ago
20/20Version history — 110 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesgpt-researcher
ecosystemspypi
any_deprecatedno
min_days_since_publish8

Engineering Quality

Are baseline engineering and documentation practices in place?

84Good · 20% of overall
How it's scored
24/24CI workflows — 5 workflow(s)
24/24Tests present
16/16Linter config — .eslintrc.json
0/9.6Pre-commit hooks
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 8 out of 9 merged PRs checked by a CI test -- score normalized to 8
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://gptr.dev
10/10Repository description
10/10Topics — 11 topics
0/10Wiki
Inputs used
topicsai, python, agent, automation, research, search, webscraping, llms, deepresearch, mcp, mcp-server
has_wikino
homepagehttps://gptr.dev
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

70Good · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — no data
2/2.5CI-Tests — 8 out of 9 merged PRs checked by a CI test -- score normalized to 8
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0.8/7.5Code-Review — Found 1/9 approved changesets -- score normalized to 1
2.5/2.5Contributors — project has 13 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 18 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate6.2
Excluded from scoring (no data or not applicable): branch_protection, packaging, signed_releases. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages159
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the pypi:gpt-researcher@0.16.0 runtime dependency closure — what installing the published package pulls in — 159 packages. Reachability is not analyzed.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

80Good · 0% of overall
How it's scored
45/45Agent instructions — .cursorrules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 95 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.95
agent_instruction_files.cursorrules
agent_instruction_max_bytes5,937
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — .eslintrc.json
11/11Static type checking — frontend/nextjs/tsconfig.json
10/10Reproducible environment — Dockerfile
10/10Demonstrated agent practice — 13 of the last 100 commits agent-authored or agent-credited
5/8Automated maintenance — dependency automation configured, none observed in the sampled commits
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileyes
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configsfrontend/nextjs/tsconfig.json
agent_commit_share0.13
toolchain_manifests
dependency_bot_commit_share0
How it's scored
27/45Type-checkable code — Python with type-check config (frontend/nextjs/tsconfig.json)
54.9/55Manageable file sizes — 1/367 source files over 60KB
Inputs used
primary_languagePython
largest_source_bytes84,260
source_files_sampled367
oversized_source_files1
How it's scored
40/40API schema (OpenAPI/GraphQL/proto) — .triage/engagement.graphql
20/20MCP server
40/40Runnable examples — examples, notebooks
Inputs used
example_dirsexamples, notebooks
has_mcp_signalyes
api_schema_files.triage/engagement.graphql

Key facts

28,654GitHub stars
98contributors
372commits, last 12 months
8days since last push
72releases
1bus factor
44open issues
npm, PyPIpackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch npm package 'simple_js_test' from its registry

More detail

Star and fork history 0 ★ / 3,866 ⇿
0Stars
3,866Forks
14Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

Only the most recent history is shown — this repository exceeds the collection window, so the earliest history is not captured.

2,5003,0003,5004,0003,866112025-082026-022026-07
Major 0Minor 3Patch 6
OpenSSF Scorecard 6.2 / 10
6.2aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-27 00:32 UTC

10Binary-Artifactsno binaries found in the repo
n/aBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
8CI-Tests8 out of 9 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
1Code-ReviewFound 1/9 approved changesets -- score normalized to 1
10Contributorsproject has 13 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 18 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 141
RegistryPackageVersion constraintManifest
npm@langchain/langgraph-sdk^0.0.1-rc.13multi_agents/package.json
PyPIaiofiles>=23.2.1pyproject.toml
PyPIaiohappyeyeballs>=2.6.1pyproject.toml
PyPIaiohttp>=3.12.0pyproject.toml
PyPIaiosignal>=1.3.2pyproject.toml
PyPIannotated-types>=0.7.0pyproject.toml
PyPIanyio>=4.9.0pyproject.toml
PyPIarxiv>=2.0.0pyproject.toml
PyPIattrs>=25.3.0pyproject.toml
PyPIbackoff>=2.2.1pyproject.toml
PyPIbeautifulsoup4>=4.12.2pyproject.toml
PyPIbrotli>=1.2.0pyproject.toml
PyPIcertifi>=2025.4.26pyproject.toml
PyPIcffi>=1.17.1pyproject.toml
PyPIchardet>=5.2.0pyproject.toml
PyPIcharset-normalizer>=3.4.2pyproject.toml
PyPIclick>=8.1.0pyproject.toml
PyPIcolorama>=0.4.6pyproject.toml
PyPIcryptography>=45.0.2pyproject.toml
PyPIcssselect2>=0.8.0pyproject.toml
PyPIdataclasses-json>=0.6.7pyproject.toml
PyPIdistro>=1.9.0pyproject.toml
PyPIdocopt>=0.6.2pyproject.toml
PyPIduckduckgo-search>=4.1.1pyproject.toml
PyPIemoji>=2.14.1pyproject.toml
PyPIfastapi>=0.104.1pyproject.toml
PyPIfeedparser>=6.0.11pyproject.toml
PyPIfilelock>=3.18.0pyproject.toml
PyPIfiletype>=1.2.0pyproject.toml
PyPIfonttools>=4.58.0pyproject.toml
PyPIfrozenlist>=1.6.0pyproject.toml
PyPIfsspec>=2025.5.1pyproject.toml
PyPIgreenlet>=3.2.2pyproject.toml
PyPIh11>=0.16.0pyproject.toml
PyPIhtml5lib>=1.1pyproject.toml
PyPIhtmldocx>=0.0.6pyproject.toml
PyPIhttpcore>=1.0.9pyproject.toml
PyPIhttpx>=0.28.1pyproject.toml
PyPIhttpx-aiohttp>=0.1.4pyproject.toml
PyPIhttpx-sse>=0.4.0pyproject.toml
PyPIhuggingface-hub>=0.32.0pyproject.toml
PyPIidna>=3.10pyproject.toml
PyPIimportlib-metadata>=8.7.0pyproject.toml
PyPIjinja2>=3.1.6pyproject.toml
PyPIjiter>=0.10.0pyproject.toml
PyPIjoblib>=1.5.1pyproject.toml
PyPIjson-repair>=0.44.0pyproject.toml
PyPIjson5>=0.12.0pyproject.toml
PyPIjsonpatch>=1.33pyproject.toml
PyPIjsonpointer>=3.0.0pyproject.toml
PyPIjsonschema>=4.23.0pyproject.toml
PyPIjsonschema-specifications>=2025.4.1pyproject.toml
PyPIkiwisolver>=1.4.5pyproject.toml
PyPIlangchain>=1.0.0pyproject.toml
PyPIlangchain-classic>=1.0.0pyproject.toml
PyPIlangchain-community>=0.4.0pyproject.toml
PyPIlangchain-core>=1.0.0pyproject.toml
PyPIlangchain-ollama>=1.0.0pyproject.toml
PyPIlangchain-openai>=1.0.0pyproject.toml
PyPIlangchain-text-splitters>=1.0.0pyproject.toml
PyPIlangdetect>=1.0.9pyproject.toml
PyPIlanggraph>=0.2.76pyproject.toml
PyPIlanggraph-checkpoint>=2.0.26pyproject.toml
PyPIlanggraph-cli>=0.2.10pyproject.toml
PyPIlanggraph-sdk>=0.1.70pyproject.toml
PyPIlangsmith>=0.3.42pyproject.toml
PyPIlitellm>=1.71.0pyproject.toml
PyPIloguru>=0.7.3pyproject.toml
PyPIlxml>=5.4.0pyproject.toml
PyPImarkdown>=3.8pyproject.toml
PyPImarkdown2>=2.5.3pyproject.toml
PyPImarkupsafe>=3.0.2pyproject.toml
PyPImarshmallow>=3.26.1pyproject.toml
PyPImcp>=1.9.1pyproject.toml
PyPImd2pdf>=1.0.1pyproject.toml
PyPImistune>=3.1.3pyproject.toml
PyPImultidict>=6.4.4pyproject.toml
PyPImypy-extensions>=1.1.0pyproject.toml
PyPInest-asyncio>=1.6.0pyproject.toml
PyPInltk>=3.9.1pyproject.toml
PyPInumpy>=2.0.0,<2.3.0pyproject.toml
PyPIolefile>=0.47pyproject.toml
PyPIollama>=0.4.8pyproject.toml
PyPIopenai>=1.82.0pyproject.toml
PyPIorjson>=3.10.18pyproject.toml
PyPIormsgpack>=1.10.0pyproject.toml
PyPIpackaging>=24.2pyproject.toml
PyPIpillow>=11.2.1pyproject.toml
PyPIprimp>=0.15.0pyproject.toml
PyPIpropcache>=0.3.1pyproject.toml
PyPIpsutil>=6.0.0pyproject.toml
PyPIpycparser>=2.22pyproject.toml
PyPIpydantic>=2.11.5pyproject.toml
PyPIpydantic-core>=2.33.2pyproject.toml
PyPIpydantic-settings>=2.9.1pyproject.toml
PyPIpydyf>=0.11.0pyproject.toml
PyPIpymupdf>=1.26.0pyproject.toml
PyPIpypdf>=5.5.0pyproject.toml
PyPIpyphen>=0.17.2pyproject.toml
PyPIpython-docx>=1.1.2pyproject.toml
PyPIpython-dotenv>=1.1.0pyproject.toml
PyPIpython-iso639>=2025.2.18pyproject.toml
PyPIpython-magic>=0.4.27pyproject.toml
PyPIpython-multipart>=0.0.20pyproject.toml
PyPIpython-oxmsg>=0.0.2pyproject.toml
PyPIpyyaml>=6.0.2pyproject.toml
PyPIrapidfuzz>=3.13.0pyproject.toml
PyPIreferencing>=0.36.2pyproject.toml
PyPIregex>=2024.11.6pyproject.toml
PyPIrequests>=2.32.3pyproject.toml
PyPIrequests-toolbelt>=1.0.0pyproject.toml
PyPIrpds-py>=0.25.1pyproject.toml
PyPIsgmllib3k>=1.0.0pyproject.toml
PyPIsix>=1.17.0pyproject.toml
PyPIsniffio>=1.3.1pyproject.toml
PyPIsoupsieve>=2.7pyproject.toml
PyPIsqlalchemy>=2.0.41pyproject.toml
PyPIsse-starlette>=2.3.5pyproject.toml
PyPIstarlette>=0.46.2pyproject.toml
PyPItenacity>=9.1.2pyproject.toml
PyPItiktoken>=0.9.0pyproject.toml
PyPItinycss2>=1.4.0pyproject.toml
PyPItinyhtml5>=2.0.0pyproject.toml
PyPItokenizers>=0.21.1pyproject.toml
PyPItqdm>=4.67.1pyproject.toml
PyPItyping-extensions>=4.13.2pyproject.toml
PyPItyping-inspect>=0.9.0pyproject.toml
PyPItyping-inspection>=0.4.1pyproject.toml
PyPIunstructured>=0.17.2pyproject.toml
PyPIunstructured-client>=0.35.0pyproject.toml
PyPIurllib3>=2.4.0pyproject.toml
PyPIuvicorn>=0.34.2pyproject.toml
PyPIweasyprint>=65.1pyproject.toml
PyPIwebencodings>=0.5.1pyproject.toml
PyPIwebsockets>=15.0.1pyproject.toml
PyPIwin32-setctime>=1.2.0pyproject.toml
PyPIwrapt>=1.17.2pyproject.toml
PyPIyarl>=1.20.0pyproject.toml
PyPIzipp>=3.21.0pyproject.toml
PyPIzopfli>=0.2.3.post1pyproject.toml
PyPIzstandard>=0.23.0pyproject.toml
All dependencies 236

Full resolved dependency set from the GitHub dependency graph: 142 direct and 94 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
npm@langchain/langgraph-sdk^0.0.1-rc.12direct
npm@langchain/langgraph-sdk^0.0.1-rc.13direct
PyPIaiofilesdirect
PyPIaiohappyeyeballsdirect
PyPIaiohttpdirect
PyPIaiosignaldirect
PyPIannotated-typesdirect
PyPIanyiodirect
PyPIarxivdirect
PyPIattrsdirect
PyPIbackoffdirect
PyPIbeautifulsoup4direct
PyPIbrotlidirect
PyPIcertifidirect
PyPIcffidirect
PyPIchardetdirect
PyPIcharset-normalizerdirect
PyPIclickdirect
PyPIcoloramadirect
PyPIcryptographydirect
PyPIcssselect2direct
PyPIdataclasses-jsondirect
PyPIdistrodirect
PyPIdocoptdirect
PyPIduckduckgo-searchdirect
PyPIemojidirect
PyPIfastapidirect
PyPIfeedparserdirect
PyPIfilelockdirect
PyPIfiletypedirect
PyPIfonttoolsdirect
PyPIfrozenlistdirect
PyPIfsspecdirect
PyPIgreenletdirect
PyPIh11direct
PyPIhtml5libdirect
PyPIhtmldocxdirect
PyPIhttpcoredirect
PyPIhttpxdirect
PyPIhttpx-aiohttpdirect
PyPIhttpx-ssedirect
PyPIhuggingface-hubdirect
PyPIidnadirect
PyPIimportlib-metadatadirect
PyPIjinja2direct
PyPIjiterdirect
PyPIjoblibdirect
PyPIjson-repairdirect
PyPIjson5direct
PyPIjsonpatchdirect
PyPIjsonpointerdirect
PyPIjsonschemadirect
PyPIjsonschema-specificationsdirect
PyPIkiwisolverdirect
PyPIlangchaindirect
PyPIlangchain-classicdirect
PyPIlangchain-communitydirect
PyPIlangchain-coredirect
PyPIlangchain-ollamadirect
PyPIlangchain-openaidirect
PyPIlangchain-text-splittersdirect
PyPIlangdetectdirect
PyPIlanggraphdirect
PyPIlanggraph-checkpointdirect
PyPIlanggraph-clidirect
PyPIlanggraph-sdkdirect
PyPIlangsmithdirect
PyPIlitellmdirect
PyPIlogurudirect
PyPIlxmldirect
PyPImarkdowndirect
PyPImarkdown2direct
PyPImarkupsafedirect
PyPImarshmallowdirect
PyPImcpdirect
PyPImd2pdfdirect
PyPImistunedirect
PyPImultidictdirect
PyPImypy-extensionsdirect
PyPInest-asynciodirect
PyPInltkdirect
PyPInumpydirect
PyPIolefiledirect
PyPIollamadirect
PyPIopenaidirect
PyPIorjsondirect
PyPIormsgpackdirect
PyPIpackagingdirect
PyPIpillowdirect
PyPIprimpdirect
PyPIpropcachedirect
PyPIpsutildirect
PyPIpycparserdirect
PyPIpydanticdirect
PyPIpydantic-coredirect
PyPIpydantic-settingsdirect
PyPIpydyfdirect
PyPIpymupdfdirect
PyPIpypdfdirect
PyPIpyphendirect
PyPIpython-docxdirect
PyPIpython-dotenvdirect
PyPIpython-iso639direct
PyPIpython-magicdirect
PyPIpython-multipartdirect
PyPIpython-oxmsgdirect
PyPIpyyamldirect
PyPIrapidfuzzdirect
PyPIreferencingdirect
PyPIregexdirect
PyPIrequestsdirect
PyPIrequests-toolbeltdirect
PyPIrpds-pydirect
PyPIsgmllib3kdirect
PyPIsixdirect
PyPIsniffiodirect
PyPIsoupsievedirect
PyPIsqlalchemydirect
PyPIsse-starlettedirect
PyPIstarlettedirect
PyPItenacitydirect
PyPItiktokendirect
PyPItinycss2direct
PyPItinyhtml5direct
PyPItokenizersdirect
PyPItqdmdirect
PyPItyping-extensionsdirect
PyPItyping-inspectdirect
PyPItyping-inspectiondirect
PyPIunstructureddirect
PyPIunstructured-clientdirect
PyPIurllib3direct
PyPIuvicorndirect
PyPIweasyprintdirect
PyPIwebencodingsdirect
PyPIwebsocketsdirect
PyPIwin32-setctimedirect
PyPIwraptdirect
PyPIyarldirect
PyPIzippdirect
PyPIzopflidirect
PyPIzstandarddirect
npm@babel/core^7.26.9indirect
npm@babel/plugin-syntax-flow^7.26.0indirect
npm@babel/plugin-transform-typescript^7.26.8indirect
npm@babel/preset-env^7.26.9indirect
npm@babel/preset-react^7.26.3indirect
npm@babel/preset-typescript^7.26.0indirect
npm@docusaurus/core3.7.0indirect
npm@docusaurus/preset-classic3.7.0indirect
npm@docusaurus/theme-mermaid3.7.0indirect
npm@ducanh2912/next-pwa^10.0.1indirect
npm@easyops-cn/docusaurus-search-local^0.49.2indirect
npm@emotion/react^11.10.5indirect
npm@emotion/styled^11.10.5indirect
npm@mdx-js/react^3.1.0indirect
npm@mozilla/readability^0.5.0indirect
npm@next/third-parties^15.1.6indirect
npm@rollup/plugin-alias^5.1.1indirect
npm@rollup/plugin-babel^6.0.4indirect
npm@rollup/plugin-commonjs^28.0.2indirect
npm@rollup/plugin-json^6.1.0indirect
npm@rollup/plugin-node-resolve^16.0.0indirect
npm@rollup/plugin-replace^6.0.2indirect
npm@rollup/plugin-typescript^12.1.2indirect
npm@svgr/webpack^8.1.0indirect
npm@tailwindcss/typography^0.5.16indirect
npm@types/jsdom^21.1.6indirect
npm@types/node^20indirect
npm@types/react^18indirect
npm@types/react-dom^18indirect
npm@types/uuid^10.0.0indirect
npmautoprefixer^10.4.20indirect
npmaxios^1.3.2indirect
npmclsx^1.1.1indirect
npmdate-fns^4.1.0indirect
npmdiscord.js^14.16.1indirect
npmdotenv^16.4.5indirect
npmeslint^8indirect
npmeslint-config-next14.2.3indirect
npmeventsource-parser^1.1.2indirect
npmexpress^4.17.1indirect
npmfile-loader^6.2.0indirect
npmframer-motion^9.0.2indirect
npmgeist^1.3.1indirect
npmhast-util-is-element1.1.0indirect
npmisomorphic-dompurify^3.0.0indirect
npmjsonrepair^3.8.0indirect
npmminimatch3.0.5indirect
npmnext^14.2.28indirect
npmnext-plausible^3.12.0indirect
npmnodemon^3.1.4indirect
npmpostcss^8indirect
npmprettier^3.2.5indirect
npmprettier-plugin-tailwindcss^0.6.0indirect
npmreact^18.0.0indirect
npmreact^18.0.1indirect
npmreact-dom^18.0.0indirect
npmreact-dom^18.0.1indirect
npmreact-dropzone^14.2.3indirect
npmreact-ga4^2.1.0indirect
npmreact-hot-toast^2.4.1indirect
npmrehype-katex7indirect
npmrehype-prism-plus^2.0.0indirect
npmremark^15.0.1indirect
npmremark-gfm^4.0.1indirect
npmremark-html^16.0.1indirect
npmremark-math6indirect
npmremark-parse^11.0.0indirect
npmrollup^2.79.2indirect
npmrollup-plugin-peer-deps-external^2.2.4indirect
npmrollup-plugin-postcss^4.0.2indirect
npmrollup-plugin-terser^7.0.2indirect
npmrollup-plugin-typescript2^0.31.2indirect
npmtailwindcss^3.4.1indirect
npmtrim^0.0.3indirect
npmtypescript^5indirect
npmurl-loader^4.1.1indirect
npmws^8.18.0indirect
npmzod^3.0.0indirect
npmzod-to-json-schema^3.23.0indirect
PyPIag2indirect
PyPIddgsindirect
PyPIdeepagentsindirect
PyPIgoogle-genaiindirect
PyPIjudgesindirect
PyPIlangchain-mcp-adaptersindirect
PyPIpandasindirect
PyPIpython-3-11indirect
PyPIpython-pptxindirect
PyPItavily-pythonindirect
PyPItypes-aiofilesindirect
PyPItypes-beautifulsoup4indirect
PyPItypes-coloramaindirect
PyPItypes-markdownindirect
PyPItypes-requestsindirect
Dependency advisories 0

Installing pypi:gpt-researcher@0.16.0 pulls in 159 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "ai",
        "python",
        "agent",
        "automation",
        "research",
        "search",
        "webscraping",
        "llms",
        "deepresearch",
        "mcp",
        "mcp-server"
      ],
      "is_fork": false,
      "size_kb": 44783,
      "has_wiki": false,
      "homepage": "https://gptr.dev",
      "languages": {
        "jq": 629,
        "CSS": 81503,
        "HCL": 24833,
        "HTML": 23653,
        "Python": 1018824,
        "Procfile": 146,
        "Dockerfile": 4500,
        "JavaScript": 92671,
        "TypeScript": 361893
      },
      "pushed_at": "2026-07-18T07:56:55Z",
      "created_at": "2023-05-12T10:33:54Z",
      "owner_type": "User",
      "updated_at": "2026-07-26T23:41:35Z",
      "description": "An autonomous agent that conducts deep research on any data using any LLM providers",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Python",
      "significant_languages": [
        "Python",
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "www.assafelovic.com",
      "name": "Assaf Elovic",
      "type": "User",
      "login": "assafelovic",
      "company": "Tavily.com",
      "location": null,
      "followers": 1219,
      "avatar_url": "https://avatars.githubusercontent.com/u/13554167?v=4",
      "created_at": "2015-07-29T10:48:58Z",
      "is_verified": null,
      "public_repos": 23,
      "account_age_days": 4015
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v3.6.0",
          "kind": "minor",
          "published_at": "2026-07-18T07:56:56Z"
        },
        {
          "tag": "v3.5.1",
          "kind": "patch",
          "published_at": "2026-06-23T18:08:17Z"
        },
        {
          "tag": "v3.5.0",
          "kind": "minor",
          "published_at": "2026-05-28T07:24:31Z"
        },
        {
          "tag": "v3.4.4",
          "kind": "patch",
          "published_at": "2026-04-16T17:40:28Z"
        },
        {
          "tag": "v3.4.3",
          "kind": "patch",
          "published_at": "2026-03-13T14:06:38Z"
        },
        {
          "tag": "v3.4.2",
          "kind": "patch",
          "published_at": "2026-03-01T14:20:43Z"
        },
        {
          "tag": "v3.4.1",
          "kind": "patch",
          "published_at": "2026-02-21T07:19:02Z"
        },
        {
          "tag": "v3.4.0",
          "kind": "minor",
          "published_at": "2026-01-29T11:56:28Z"
        },
        {
          "tag": "v3.3.9",
          "kind": "patch",
          "published_at": "2026-01-25T06:41:51Z"
        },
        {
          "tag": "v.3.3.8",
          "kind": "other",
          "published_at": "2025-12-14T08:08:22Z"
        },
        {
          "tag": "v.3.3.7",
          "kind": "other",
          "published_at": "2025-11-07T14:10:38Z"
        },
        {
          "tag": "v.3.3.6",
          "kind": "other",
          "published_at": "2025-10-07T14:44:05Z"
        },
        {
          "tag": "v.3.3.5",
          "kind": "other",
          "published_at": "2025-09-23T07:52:30Z"
        },
        {
          "tag": "v.3.3.4",
          "kind": "other",
          "published_at": "2025-09-17T11:12:43Z"
        },
        {
          "tag": "v.3.3.3",
          "kind": "other",
          "published_at": "2025-08-08T05:03:19Z"
        },
        {
          "tag": "v.3.3.2",
          "kind": "other",
          "published_at": "2025-07-19T07:20:52Z"
        },
        {
          "tag": "v.3.3.1",
          "kind": "other",
          "published_at": "2025-07-04T08:51:49Z"
        },
        {
          "tag": "v3.3.0",
          "kind": "minor",
          "published_at": "2025-06-08T17:45:48Z"
        },
        {
          "tag": "v3.2.9",
          "kind": "patch",
          "published_at": "2025-06-01T15:33:49Z"
        },
        {
          "tag": "v3.2.8",
          "kind": "patch",
          "published_at": "2025-05-04T05:27:32Z"
        },
        {
          "tag": "v3.2.7",
          "kind": "patch",
          "published_at": "2025-04-07T09:49:44Z"
        },
        {
          "tag": "v3.2.6",
          "kind": "patch",
          "published_at": "2025-03-31T07:52:26Z"
        },
        {
          "tag": "v3.2.5",
          "kind": "patch",
          "published_at": "2025-03-27T12:47:58Z"
        },
        {
          "tag": "v3.2.4",
          "kind": "patch",
          "published_at": "2025-03-10T06:48:32Z"
        },
        {
          "tag": "v3.2.3",
          "kind": "patch",
          "published_at": "2025-02-28T09:22:19Z"
        },
        {
          "tag": "v3.2.2",
          "kind": "patch",
          "published_at": "2025-02-24T06:55:44Z"
        },
        {
          "tag": "v3.2.1",
          "kind": "patch",
          "published_at": "2025-02-15T14:03:59Z"
        },
        {
          "tag": "v3.2.0",
          "kind": "minor",
          "published_at": "2025-02-12T06:38:08Z"
        },
        {
          "tag": "v3.1.9",
          "kind": "patch",
          "published_at": "2025-01-28T08:06:50Z"
        },
        {
          "tag": "v3.1.8",
          "kind": "patch",
          "published_at": "2025-01-05T10:05:14Z"
        },
        {
          "tag": "v.3.1.7",
          "kind": "other",
          "published_at": "2024-12-29T06:40:17Z"
        },
        {
          "tag": "v3.1.6",
          "kind": "patch",
          "published_at": "2024-12-22T06:35:07Z"
        },
        {
          "tag": "v3.1.5",
          "kind": "patch",
          "published_at": "2024-12-14T07:17:10Z"
        },
        {
          "tag": "v3.1.4",
          "kind": "patch",
          "published_at": "2024-11-17T12:35:41Z"
        },
        {
          "tag": "v3.1.3",
          "kind": "patch",
          "published_at": "2024-11-03T06:17:55Z"
        },
        {
          "tag": "v3.1.2",
          "kind": "patch",
          "published_at": "2024-10-25T06:18:00Z"
        },
        {
          "tag": "v3.1.1",
          "kind": "patch",
          "published_at": "2024-10-20T11:00:28Z"
        },
        {
          "tag": "v.3.1.0",
          "kind": "other",
          "published_at": "2024-10-11T07:44:46Z"
        },
        {
          "tag": "v3.0.8",
          "kind": "patch",
          "published_at": "2024-09-15T05:22:02Z"
        },
        {
          "tag": "v3.0.7",
          "kind": "patch",
          "published_at": "2024-09-07T18:04:47Z"
        },
        {
          "tag": "v3.0.6",
          "kind": "patch",
          "published_at": "2024-08-26T08:05:27Z"
        },
        {
          "tag": "v.3.0.5",
          "kind": "other",
          "published_at": "2024-08-18T06:11:13Z"
        },
        {
          "tag": "v3.0.4",
          "kind": "patch",
          "published_at": "2024-08-12T12:38:17Z"
        },
        {
          "tag": "v3.0.3",
          "kind": "patch",
          "published_at": "2024-08-04T07:47:28Z"
        },
        {
          "tag": "v3.0.2",
          "kind": "patch",
          "published_at": "2024-07-29T05:42:41Z"
        },
        {
          "tag": "v.0.3.1",
          "kind": "other",
          "published_at": "2024-07-21T07:50:51Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2024-07-15T10:22:43Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2024-07-06T13:54:54Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2024-06-23T09:53:26Z"
        },
        {
          "tag": "v.0.2.6",
          "kind": "other",
          "published_at": "2024-06-16T08:33:04Z"
        },
        {
          "tag": "v.0.2.5",
          "kind": "other",
          "published_at": "2024-06-09T06:25:06Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2024-05-27T10:41:15Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2024-05-20T06:44:41Z"
        },
        {
          "tag": "v.0.2.2",
          "kind": "other",
          "published_at": "2024-05-09T12:45:51Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2024-05-05T07:31:40Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2024-04-02T07:10:35Z"
        },
        {
          "tag": "v.0.1.6",
          "kind": "other",
          "published_at": "2024-03-24T07:40:51Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2024-03-18T12:12:21Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2024-02-25T09:14:12Z"
        },
        {
          "tag": "0.1.3",
          "kind": "patch",
          "published_at": "2024-01-07T14:08:56Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2024-01-04T12:05:11Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2023-11-25T15:11:58Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2023-11-13T18:35:18Z"
        },
        {
          "tag": "v0.0.8",
          "kind": "patch",
          "published_at": "2023-11-07T15:19:37Z"
        },
        {
          "tag": "v0.0.7",
          "kind": "patch",
          "published_at": "2023-10-21T11:26:16Z"
        },
        {
          "tag": "v.0.0.6",
          "kind": "other",
          "published_at": "2023-10-03T14:21:15Z"
        },
        {
          "tag": "v0.0.5",
          "kind": "patch",
          "published_at": "2023-09-10T15:13:41Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2023-08-14T06:34:22Z"
        },
        {
          "tag": "v0.0.3",
          "kind": "patch",
          "published_at": "2023-07-26T05:24:53Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2023-07-15T07:09:28Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2023-07-10T16:00:15Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2023-07-09T17:19:46Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "5d84d2f5553e70a2765a8ff3a0d2672d60437ce8",
          "body": "docs(skill): fix drift in .claude reference docs (retrievers, multi-agents, api)",
          "is_bot": false,
          "headline": "Merge pull request #1913 from assafelovic/docs/skill-reference-refresh",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-14T13:13:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec3cdb0e3e0dbc997ee160c5fa095db3ad788034",
          "body": "Audited the Claude skill references against current code and fixed verified\ndrift (skill itself + other references were accurate):\n\n- retrievers.md: list all 21 retrievers (was 13) incl. Brave/SearX/GroundRoute/\n  fastCRW/BoCha/Xquik/OpenAlex/GetXAPI; fix get_retrievers() signature to the\n  real (he\n[…]\nsts\n  (no top-level 'costs'); DELETE /files/{filename} (not /delete/); add GET /files/;\n  remove non-existent /getConfig & /setConfig endpoints\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skill): fix drift in .claude reference docs",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-14T13:13:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "48e5f7b160a934aa18e6dd2876461f388a6a26a2",
          "body": "…agents\n\nchore(multi_agents): nest AG2 variant under multi_agents/ag2",
          "is_bot": false,
          "headline": "Merge pull request #1912 from assafelovic/chore/nest-ag2-under-multi-…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-14T13:02:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d57e6908a0cb3490796a91ee8e6b9f0be39aed0",
          "body": "Move the standalone multi_agents_ag2/ directory to multi_agents/ag2/ so the\nAG2 (AutoGen) variant lives under the multi_agents package instead of a\nseparate top-level directory. The AG2 code already depended on multi_agents\n(reusing its agents + utils), so this reflects the real relationship.\n\nUpdat\n[…]\nplus doc/README paths.\nHistory preserved via git mv; primary multi_agents package and the runner\nfallback both verified importable, tests pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(multi_agents): nest AG2 variant under multi_agents/ag2",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-14T13:00:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab79fcd6ad5004cd808f3833843e1b1cc2c10651",
          "body": "…ider\n\nfeat: add Nebius Token Factory as LLM and embedding provider",
          "is_bot": false,
          "headline": "Merge pull request #1891 from teionarr/feat/nebius-token-factory-prov…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-14T12:44:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c68c773326c0883a8a7c5e49f2a997b4e9a00b9c",
          "body": "Reconcile master→main: GetXAPI retriever, Claude 4.x temp fix, MiniMax M3, curate_sources fixes",
          "is_bot": false,
          "headline": "Merge pull request #1911 from assafelovic/reconcile-master",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-14T12:42:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1142323feaf880042eec3caf1b945315f583d80",
          "body": "Core/misc hardening: 11 fixes (costs/query/llm/agent/mcp/config) (supersedes #1822…#1902)",
          "is_bot": false,
          "headline": "Merge pull request #1910 from assafelovic/batch-core-misc",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-14T12:42:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "130d255a6733aeb0ece1a0c7aa87492a04940d82",
          "body": "Multi-agent robustness: bound revision loops + exact sentinels (supersedes #1883/#1885/#1886)",
          "is_bot": false,
          "headline": "Merge pull request #1909 from assafelovic/batch-multiagents-bounds",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-14T12:41:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb4c4972e8b4d2ee98a14c0866fcd827adf9add2",
          "body": "Scraper robustness: 6 fixes (title/PDF-detection/temp-file/dimensions) (supersedes #1824…#1842)",
          "is_bot": false,
          "headline": "Merge pull request #1908 from assafelovic/batch-scraper-robustness",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-14T12:41:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4370ed948baaf5edbfeb0b739371f55e79f84663",
          "body": "Retriever hardening: 20 guard fixes against malformed results (supersedes #1837…#1890)",
          "is_bot": false,
          "headline": "Merge pull request #1907 from assafelovic/batch-retriever-guards",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-14T12:41:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "747d898e1cf1453470698b5f22511734ae400898",
          "body": "Resolve post-merge conflicts: 4 retriever/context fixes (supersedes #1895-1898)",
          "is_bot": false,
          "headline": "Merge pull request #1906 from assafelovic/pr-conflict-fixes",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-14T12:41:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb3ec9ebfdf45af6841c5bcee549f248800eb1e0",
          "body": "(cherry picked from commit a8131af12dc83462ddca3418712b887b47363070)",
          "is_bot": false,
          "headline": "Add GetXAPI retriever for X/Twitter search",
          "author_name": "Bozad",
          "author_login": "bozad-getxapi",
          "committed_at": "2026-07-14T12:06:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a99431cae6ee4305f17c8cd0075856038cd5cdd2",
          "body": "Anthropic deprecates the temperature parameter on Claude Sonnet 4.5+,\nOpus 4.5+, and Haiku 4.5+. Passing temperature to these models now\nreturns a 400 error: \"'temperature' is deprecated for this model\".\n\nThis breaks the report-writer step in gpt-researcher when configured\nwith anthropic:claude-sonn\n[…]\nthat already handles GPT-5 and\nthe o1/o3/o4 reasoning models.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n(cherry picked from commit e199a5b03ec7998960df727f3882ccc6353f6ace)",
          "is_bot": false,
          "headline": "Add Claude 4.x family to NO_SUPPORT_TEMPERATURE_MODELS",
          "author_name": "gk_jarvis",
          "author_login": "aob-bot",
          "committed_at": "2026-07-14T12:05:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "17fe3f4e02e08f7bc679be78f8bbdba9d0d797c8",
          "body": "- Add MiniMax-M3 to model list and set as default\n- Keep MiniMax-M2.7 and MiniMax-M2.7-highspeed\n- Remove older models (M2.5/M2.5-highspeed)\n- Update related documentation\n\n(cherry picked from commit 18893c0181f200de3e08c7ba8b770658c129ac2a)",
          "is_bot": false,
          "headline": "feat: upgrade MiniMax default model to M3",
          "author_name": "octo-patch",
          "author_login": null,
          "committed_at": "2026-07-14T12:04:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "365bc359dbbf4100f9bb1bc6528eb6b6be16bce0",
          "body": "…rcher.context\n\ncurate_sources() returns List[dict] (each dict contains Title, Content, Source\nkeys), but researcher.context is expected to be a str throughout the codebase.\nAssigning the List[dict] directly causes any downstream str operation to crash:\n\n  - len(researcher.context) returns the list \n[…]\nntent / Source' block joined by double newlines.\nNon-dict items fall back to str(). Non-list returns are passed through unchanged.\n\n(cherry picked from commit f71b95ba8aebca9343ac50985a2e9c0548d38cfb)",
          "is_bot": false,
          "headline": "fix: normalize curate_sources() return type before assigning to resea…",
          "author_name": "Jason Broderick",
          "author_login": "JasonBroderick",
          "committed_at": "2026-07-14T12:04:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b6a70d98b10474a1c89838163ef5a5f864abc4f3",
          "body": "When CURATE_SOURCES=True, ResearchConductor.conduct_research() returns\nresult['context'] as a List[dict] (each dict has Title/Content/Source keys)\nrather than a plain str. Two separate crash paths:\n\n1. all_context.append(result['context']) nests the list as a single item,\n   so context_with_citation\n[…]\nmade type-safe so any residual\n   dict items are extracted via their 'Content' key rather than crashing.\n\nFixes #1279, fixes #1332\n\n(cherry picked from commit 216899eebf0cdc78390fd1886d1bb0b1113ce81f)",
          "is_bot": false,
          "headline": "fix: handle List[dict] context from CURATE_SOURCES=True in deep research",
          "author_name": "Jason Broderick",
          "author_login": "JasonBroderick",
          "committed_at": "2026-07-14T12:04:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0dacc2326d61db2c257547764e9cd61df835640",
          "body": "…yntax\n\nThe generate_search_queries_prompt() function said 'Write N google search\nqueries'. Instruction-following LLMs (e.g. GPT-5.4) interpret this literally\nand inject Google-specific operator syntax such as site:arxiv.org,\nfiletype:pdf, inurl:, intitle:, OR, AND into the generated queries.\n\nMost \n[…]\n operator syntax and explain why\n- Keep the fix backend-neutral so it is correct regardless of which\n  retriever(s) are configured\n\n(cherry picked from commit c15a8636e142e8a0b93f6896aa10e524d643d1bc)",
          "is_bot": false,
          "headline": "fix: make search query prompt retriever-agnostic, prohibit operator s…",
          "author_name": "Jason Broderick",
          "author_login": "JasonBroderick",
          "committed_at": "2026-07-14T12:04:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "03964d3ae20859bd0f9c5f56ab14ad0529a0befc",
          "body": "The loader_dict in _load_document keys formats in lower-case (pdf, docx,\nxlsx, ...), but _get_extension returned the raw suffix. A URL ending in\nan upper-case extension (e.g. report.PDF, doc.DOCX — common on direct\nlinks and signed CDN URLs) produced an upper-case format string that\nmissed every loader_dict key, so the document was silently skipped.\n\nLower-case the extracted extension so the loader lookup matches.\n\n(cherry picked from commit c67a179c8bbb1b0e8a910b2816b5f82cfd38d013)",
          "is_bot": false,
          "headline": "fix(document): normalise URL extension case in OnlineDocumentLoader",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9094ddf5addb0717b365e57181915ac25542ee0c",
          "body": "PyMuPDFScraper downloads a remote PDF to NamedTemporaryFile(delete=False)\nand only called os.remove() on the success path. When PyMuPDFLoader.load()\nraises on a malformed/partial PDF, the broad except swallowed the error and\nleft the temp .pdf on disk every time. Wrap the load in try/finally so the\ntemp file is always cleaned up.\n\n(cherry picked from commit 124ec5c30ca5a2de14f5af2555e66550ad040de5)",
          "is_bot": false,
          "headline": "fix(scraper): remove PyMuPDF temp file even when PDF loading fails",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a5c8a4d0ec1fd7886adc6c6a6803c725577e09f",
          "body": "…rScraper\n\nThe Selenium BrowserScraper routed pages to the PDF path with\nself.url.endswith('.pdf'), which missed signed CDN/S3 links that carry a\nquery string (doc.pdf?sig=...) and was case-sensitive (.PDF). Such URLs\nfell through to HTML scraping and returned garbage. Extracted an\n_is_pdf_url helper that inspects only the URL path, lowercased.\n\n(cherry picked from commit 7e6dded91e37b4dfb9acd8d66c9b83fc5d51d997)",
          "is_bot": false,
          "headline": "fix(scraper): detect PDF links with query strings/uppercase in Browse…",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "094ca882f5075ce8948cbf6039cfb1a470df5413",
          "body": "…sion\n\nInspect only the URL path component (via urlparse) and match\ncase-insensitively so signed CDN/S3 links like '.../doc.pdf?sig=...'\nand '.PDF' route to PyMuPDFScraper instead of the HTML scraper.\n\nAdds tests/test_scraper_get_scraper.py.\n\n(cherry picked from commit b2cfa28967ce18d0d0630922c38a469ccd1ac3c3)",
          "is_bot": false,
          "headline": "fix(scraper): detect PDF links with query strings and uppercase exten…",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9db9902c776eadd8689af3e494f39fcf991bd1a3",
          "body": "…nsions\n\nparse_dimension printed an error line to stdout for every non-numeric width/height attribute. Values like '100%', 'auto', and '50em' are valid, common HTML, so normal scraping spammed application stdout. Log at debug level instead.\n\n(cherry picked from commit d5c0118773b8eade703428a11e63638007e005d4)",
          "is_bot": false,
          "headline": "fix(scraper): debug-log instead of printing on non-numeric image dime…",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5f445ca52e3904462542f23b147ef691b6bec42",
          "body": "…tags\n\nAn empty <title></title> made soup.title.string return None, violating the -> str contract and propagating None into image alt-text and document metadata across every scraper backend. Use get_text(strip=True) so the result is always a (stripped) string.\n\n(cherry picked from commit a8972cc87e73fd962e8c380adebf790bdc759024)",
          "is_bot": false,
          "headline": "fix(scraper): return empty string from extract_title for empty title …",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "032683fbd071a992034624b0cf3e7da85e5f647c",
          "body": "…dels\n\ntiktoken.encoding_for_model only knows OpenAI model names and raises KeyError for Ollama/Cohere/Nomic/HuggingFace embedding models, aborting cost tracking mid-research. Fall back to the default o200k_base encoding for a best-effort estimate.\n\n(cherry picked from commit 1f327f3167f7c330156c887d3aa027c5f7f12a29)",
          "is_bot": false,
          "headline": "fix(costs): fall back to default encoding for non-OpenAI embedding mo…",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:25:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcc1eac0ca56eb2509f2b6384b6d7117eb1fce87",
          "body": "json_repair.loads can yield a dict, bare string, or None when the LLM does not emit a clean JSON array; callers in researcher.plan_research treat the result as list[str] and crash on .append/iteration. Normalize defensively and fall back to the original query.\n\n(cherry picked from commit b3c1313fb958d60dc4550b375c894f63d36c5910)",
          "is_bot": false,
          "headline": "fix(query): always return list[str] from generate_sub_queries",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:25:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06d2d27595922c345dd8bd1d8b4ad9dc0c07d8ca",
          "body": "The error log used a plain string ('...\\n {e}') with no f-prefix, so it recorded the literal text '{e}' instead of the exception, hiding the real cause of subtopic-parsing failures. Use lazy %-formatting with exc_info and drop the redundant print.\n\n(cherry picked from commit 878243e08e2fe676a64803107b1d4fe419734667)",
          "is_bot": false,
          "headline": "fix(llm): log the real exception in construct_subtopics error handler",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:25:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cd8bec3fad5389e867995ef4387fb5d15fc78cb",
          "body": "quick_search previously only queried self.retrievers[0], ignoring any\nadditional retrievers configured via RETRIEVER (e.g. \"tavily,duckduckgo\").\nThis adds an opt-in all_retrievers flag that queries every configured\nretriever concurrently and merges the results, de-duplicated by URL\n(handling both 'u\n[…]\nl' and 'href' keys). Failing retrievers are skipped so\none bad provider does not abort the search. Default behaviour is unchanged.\n\n(cherry picked from commit 443d7c0835d7828e018500483541d3ad2a550f50)",
          "is_bot": false,
          "headline": "feat(agent): add all_retrievers option to quick_search",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:25:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0a1235a3d88fbe1b5e70ee24572193b2e230cfd9",
          "body": "Search retrievers return records keyed by 'href'/'body', but the\naggregated quick_search summary read 'url'/'content', so the\nsummarization prompt received empty source data ('[1] :  ()'). Read\n'href'/'body' with fallback to 'url'/'content' for pre-normalized records.\n\nAdds tests/test_quick_search_summary_context.py.\n\n(cherry picked from commit 3ad9e6d8766082f4af2930797dc290b8700e13fa)",
          "is_bot": false,
          "headline": "fix(agent): use real retriever keys in quick_search summary context",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:25:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20a0066ec2cfabc16c963038a4f10f865ee8b331",
          "body": "extract_json_with_regex used a non-greedy '{.*?}' pattern, which stopped\nat the first closing brace. Any agent JSON with more than one key, or a\n'}' inside a string value (e.g. an agent_role_prompt mentioning\n'{markets}'), was truncated into an invalid fragment that json.loads\ncould not parse, defeating this fallback recovery path. Use a greedy\n'{.*}' so the match spans to the last '}' and captures the full object.\n\n(cherry picked from commit 82aa0c88ee74c9407b6f0697e72749e8f899bd13)",
          "is_bot": false,
          "headline": "fix(agent): capture whole JSON object in extract_json_with_regex",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:25:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f18febecdd61bfb4c2819521eb215d77e848ff5",
          "body": "Closes #1718.\n\n(cherry picked from commit 73964b1cd58c824b0bcb06540f9c3e4b2d17e39e)",
          "is_bot": false,
          "headline": "fix(export): avoid outputs/.pdf when export filename is empty",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:25:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da6ecbb7ca0c052a6dc1c463d59a6123887888fe",
          "body": "Closes #1899.\n\nNone-sentinel coercion for Optional[str] was unreachable because the\nstr converter never raises and ran before the NoneType branch.\n\n(cherry picked from commit 02b8aebe33f850c5e4771142b69fc007e81646f8)",
          "is_bot": false,
          "headline": "fix(config): coerce none/null empty for Optional env fields",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:25:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9038ffa3fbd3902dc3a1c91340f4b6a3eedf1417",
          "body": "The guard in convert_configs_to_langchain_format checked\nserver_config['connection_type'], which is never set (only 'transport'\nis), so connection_headers were silently dropped and auth-protected\nHTTP MCP servers rejected the connection. Check 'transport' instead.\n\nCloses #1854.\n\n(cherry picked from commit 99bf7c49ae75961e3a68957869f4e4623d4e4180)",
          "is_bot": false,
          "headline": "fix(mcp): forward connection_headers for HTTP/websocket transports",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:25:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f31a26739b44931e75b6cb477c1b0c16b28edef",
          "body": "add_references iterated visited_urls directly, but that is a set whose\niteration order varies run-to-run and across processes (PYTHONHASHSEED).\nThe final report's References section was therefore non-reproducible for\nidentical inputs. Sort the URLs before rendering so the same research\nyields the same reference list.\n\n(cherry picked from commit 521d98b086b822e4fa215c6323541be08c49bd84)",
          "is_bot": false,
          "headline": "fix(report): emit references in deterministic (sorted) order",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:25:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e331e066ed2b941d928cc7e68ea6854c27b0cf10",
          "body": "Closes #1579.\n\n(cherry picked from commit f96b6ada23d05c984e6abebc22182bd33fa4348d)",
          "is_bot": false,
          "headline": "fix(deep-research): stop descent when a level yields zero results",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:25:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3dcb8392cefce7d613d4c3cdd0ae3712abe48d34",
          "body": "Add fact_check_revision_count and max_fact_check_revisions (default 3)\nso fact_checker→writer cannot stack overflow via recursion_limit.\n\n(cherry picked from commit 69381ff233acfd6989bde9a7a2adc91526e28502)",
          "is_bot": false,
          "headline": "fix(multi_agents): bound fact-checker writer revision loop",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:24:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b59b615ac099fe1ad3f9cdcaedaa2b2a9d45737",
          "body": "Add draft_revision_count + max_draft_revisions (default 3) so the\neditor loop force-accepts gracefully instead of GraphRecursionError.\nPairs with the exact None-accept fix for #1881.\n\n(cherry picked from commit b2f801a198036ac7385ba9f13d9b1db134c515bc)",
          "is_bot": false,
          "headline": "fix(multi_agents): bound reviewer/reviser draft revision loop",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:24:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72fe041b53436d5f110348c07f4093a5f73a9db2",
          "body": "Substring \"None\" accepted critical reviews as approval and published\nunrevised drafts. Match only the exact accept token (optional quotes).\nAlso fix reviser prompt string concatenation typo.\n\nCloses #1881\n\n(cherry picked from commit 5c033b44c393b6dfd0d6371709901b9189e17e5e)",
          "is_bot": false,
          "headline": "fix(multi_agents): exact None sentinel for reviewer and fact-checker",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:24:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4ecf0477114e30007bcbd8280632006b00fbe22",
          "body": "Interpolating the raw query broke searches with reserved characters\n('&' injected spurious params, '#' truncated the query). Build the\nquery string with urllib.parse.urlencode.\n\nAdds tests/test_google_search_url_encoding.py.\n\n(cherry picked from commit b59352c3c75e29e2be534c09b9647cf2b3795c6b)",
          "is_bot": false,
          "headline": "fix(google): URL-encode Custom Search query parameters",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35af8cddb6c47f4faf150755e2d0ee4afa51f3fc",
          "body": "Closes #1875.\n\n(cherry picked from commit 7f16851b1dabfb5453986a42f73856ed9198220a)",
          "is_bot": false,
          "headline": "fix(retriever): skip redundant Tavily MCP when direct Tavily is active",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2544c77120785187fd576df544daea4e342c5297",
          "body": "Comma-separated retriever lists from request headers (e.g. 'tavily, exa')\nkept surrounding whitespace, so every name after the first failed the\nexact match in get_retriever and silently fell back to the default\nretriever. Move the strip (and blank-drop) so it applies to the header\npath too, not just the config path.\n\nAdds tests/test_get_retrievers_whitespace.py.\n\n(cherry picked from commit 95530a2699086f2f2cd0bfae5759a33a181f4ba2)",
          "is_bot": false,
          "headline": "fix(retriever): strip whitespace from header-supplied retriever lists",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "078815f2a1b4a318ba9c6896e77172070c2770b3",
          "body": "VALID_SORT_CRITERIA holds the API's exact values (citationCount,\npublicationDate) and __init__ asserts membership against them, but then\nstored sort.lower(), turning citationCount into citationcount before it\nwas passed as the 'sort' query param. The Semantic Scholar API expects\nthe camelCase form, so non-default sorts were silently broken. Keep the\nalready-validated value verbatim.\n\n(cherry picked from commit 9a2cdc51aa2a3a0ee2de1c478f6d661bf3b8c575)",
          "is_bot": false,
          "headline": "fix(retriever): preserve camelCase sort criterion for Semantic Scholar",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9f1192e31e42413f1dacbb9c7bbd9203155067c",
          "body": "SearchAPIRetriever sliced page.get('raw_content', '')[:MAX], but the\ndefault only applies when the key is absent. The scraper explicitly sets\nraw_content=None for pages that failed to scrape, and slicing None raises\nTypeError, crashing context retrieval. Coerce a missing/None raw_content\nto '' before truncating (matching the defensive str() coercion already\nused in compression.py).\n\n(cherry picked from commit 2ffe6df27b4a76d51c0eae7b64ca4bdf584dc374)",
          "is_bot": false,
          "headline": "fix(context): guard SearchAPIRetriever against None raw_content",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68a9687e6b9e4daac517a1d5e1bb09b173bdc4ab",
          "body": "Validate JSON envelope/list items and harden inverted-index abstract\nreconstruction against non-dict / bad index positions.\n\n(cherry picked from commit a1984fc7ab4038d760b53da7b37b35b6d1d7138b)",
          "is_bot": false,
          "headline": "fix(retriever): guard OpenAlex against malformed result payloads",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ced8e7789a868e9618ba1eabfce54c050d0213d",
          "body": "Skip non-dict/missing-url rows; accept href/link/snippet aliases and\ntolerate list-shaped JSON envelopes.\n\n(cherry picked from commit ce1d251565a4cb842ad5c3838cee96a1626860a4)",
          "is_bot": false,
          "headline": "fix(retriever): guard GroundRoute against malformed result fields",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8927ccf4c0f6d01eaf2ef2b1223ab8576b337191",
          "body": "Skip non-dict entries and results without a URL; tolerate href/snippet\naliases and non-dict JSON envelopes.\n\n(cherry picked from commit 859d798ef5991f4d37688186e30e830b61a2206c)",
          "is_bot": false,
          "headline": "fix(retriever): guard Searx against malformed/missing result fields",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bece998ec58e74fd3341a0723ea18a1a9fb99fea",
          "body": "ddgs may emit link/url and snippet/description; map them to the shared\nretriever schema and skip entries without a URL.\n\n(cherry picked from commit f9cabc9017a05f44a9f51e630c72c7e679779c3b)",
          "is_bot": false,
          "headline": "fix(retriever): normalize DuckDuckGo results to href/body contract",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b55be535e433e6ee67210a502bd04f4bf5d4d259",
          "body": "…jects\n\nsearch / find_similar / get_contents assumed every Exa result always has\n.url / .text / .id. A single incomplete object aborted the list\ncomprehension. Skip rows without a usable href/id and fall back to\nsummary or empty text body for partial hits.\n\n(cherry picked from commit a6419dc7667929bb530a64827815d8f2588353a4)",
          "is_bot": false,
          "headline": "fix(retriever): guard ExaSearch against null url/id/text on result ob…",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f4d302d4d342c52d1367763e7a625a2850ea277",
          "body": "Prefer .get for title/snippet/link so a partial CSE item cannot raise and\nis not silently discarded beyond missing-link cases. Non-dict JSON and\nnon-dict row items return/ skip cleanly to an empty or partial list.\n\n(cherry picked from commit 48cbf35a7dd1c3964b3a576f3ec30c1c381f4543)",
          "is_bot": false,
          "headline": "fix(retriever): guard GoogleSearch against malformed CSE content items",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70f1c1fa432c7013ff6a5cca360913833e6afaa5",
          "body": "CustomRetriever previously returned None on HTTP failure and passed\nthrough null/non-list JSON payloads. Downstream iteration then raised\nTypeError (or treated the failure as \"no retriever\"), losing the research\nrun. Always return a list, reject non-list JSON as empty, and set a\ntimeout so a hung endpoint cannot block the agent.\n\n(cherry picked from commit 83909e4c63ba39c41dc4d0a386e66edbdc6e5631)",
          "is_bot": false,
          "headline": "fix(retriever): always return a list from CustomRetriever.search",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c84c633830218ccb4983dd5d650b4e5f82eda256",
          "body": "…ields\n\nA single Tavily hit missing \"url\" or \"content\" previously raised KeyError\ninside the list comprehension and dropped all results for the page. Skip\nnon-dict / empty-url hits and fall back to snippet or empty body instead.\n\n(cherry picked from commit 5e27a4530986e1008726b38f02261f5dee895815)",
          "is_bot": false,
          "headline": "fix(retriever): guard TavilySearch against malformed/missing result f…",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b24d3fa9cc8425124bd827d40b2f1c8703b8324",
          "body": "…all results\n\nCRWRetriever.search() indexed obj[\"url\"] for every source in the fastCRW\nresponse. A single source without a \"url\" key raised a KeyError that the broad\nexcept in search() swallowed, discarding every other (valid) source and\nreturning an empty list. Skip url-less sources in the comprehe\n[…]\nresults.\n\nMirrors the defensive normalization already applied to the Serper, Bing,\nSearchApi, BoCha, XQuik and SerpApi retrievers.\n\n(cherry picked from commit a5150968b47d0666a4a8065f9017705939bced34)",
          "is_bot": false,
          "headline": "fix(retriever): skip fastCRW sources missing url instead of dropping …",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d82b1ed4e358ac789efb828c7dd1ba80d0adf874",
          "body": "…fields\n\nSerpApiSearch.search() indexed organic_results and each result's link/title/\nsnippet directly. A SerpApi response with no organic_results (error payload or\na query that matched nothing) raised KeyError, and a single result missing any\nof those keys aborted the whole search() call. Use .get(\n[…]\nh href=None.\n\nThis mirrors the defensive normalization already applied to the Serper, Bing,\nSearchApi, BoCha and XQuik retrievers.\n\n(cherry picked from commit 49d025e33a32c8025dbf841ec3634e7d4c9fc96e)",
          "is_bot": false,
          "headline": "fix(retriever): guard SerpApiSearch against malformed/missing result …",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "17923cf1572740c70dba2df49a38eee0fefd13eb",
          "body": "Bing normalization looped over results outside the try/except and indexed\nresult[\"url\"]/[\"name\"]/[\"snippet\"] directly, so a single result missing any\nkey raised an unhandled KeyError that aborted the entire search(). A response\nwithout a webPages block also raised KeyError instead of returning []. Use\n.get() with defaults and remove the dead 'search_results is None' branch.\n\n(cherry picked from commit bf8defff4b049f7def0581b9e87d32cddd989bd3)",
          "is_bot": false,
          "headline": "fix(retriever): guard BingSearch against malformed/missing result fields",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ebc17919bf7d591695f5862076925108940ffc6f",
          "body": "An explicit JSON null in the Xquik API response (\"tweets\": null, or a\ntweet with \"author\": null / \"text\": null) slipped past dict.get()'s\ndefault, since get() only substitutes when the key is absent. The\nresulting None crashed author.get()/text[:120]; the broad except in\nsearch() then swallowed the error and silently dropped every result.\nUse 'or' fallbacks, matching the sibling GetXAPI retriever.\n\n(cherry picked from commit b74b07db0d331491161e30ae28c11022311c610e)",
          "is_bot": false,
          "headline": "fix(retriever): guard XquikSearch against null author/tweets/text fields",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69e46f45d67266678490058fa804cef5b39fa36c",
          "body": "BoChaSearch indexed json_response['data']['webPages']['value'] directly with\nno error handling, so a non-200 response, a non-JSON body, or a payload\nmissing those keys crashed the whole research run with an unhandled\nKeyError/JSONDecodeError. Every sibling retriever degrades to [] on failure.\nAdd raise_for_status + timeout, catch request/JSON errors, walk the response\ndefensively, and use .get() per result.\n\n(cherry picked from commit 448fccedf9501de6254103cb8f53432b8259ed68)",
          "is_bot": false,
          "headline": "fix(retriever): handle errors and missing keys in BoChaSearch",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbcb9901c54a2cda0971e3adc4eb7a463407982b",
          "body": "…earch.search\n\nPubMedCentralSearch.search returned None when no article IDs were found\n(search miss or a transient esearch failure). The result is consumed as\na list — actions.query_processing.get_search_results is typed\n-> List[Dict], and skills.researcher does len(search_results) — so a\nzero-hit P\n[…]\n has\nno len() instead of degrading to an empty result set like the other\nretrievers. Return [] and tighten the annotation to List.\n\n(cherry picked from commit 11473f23f2e5f583f5c5b0dbfc3f8730286fc183)",
          "is_bot": false,
          "headline": "fix(retriever): return empty list instead of None from PubMedCentralS…",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8a9a4e4cd567b594ebd351c418a6a576a1d5f17a",
          "body": "…earch\n\nSerperSearch.search documents a list return type, and every sibling\nretriever (serpapi/brave/bing/searx) returns [] on error. But three\nerror paths (resp is None, JSON parse failure, JSON null) returned a\nbare None. Callers treat the result as a list — get_search_results is\nannotated -> List\n[…]\nof type 'NoneType' has no len() instead of degrading\nto an empty result set.\n\nReturn [] on all three paths to honour the contract.\n\n(cherry picked from commit ffa6d5f3e1f8cc0ef3d517468ff7168ac7f57545)",
          "is_bot": false,
          "headline": "fix(retriever): return empty list instead of None from SerperSearch.s…",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T09:21:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c4595f5db67b9baa0e0575a7e26a58807b643ca",
          "body": "Closes #1893.\n\nFast-path Document metadata was the raw scraper dict (url=…), but\npretty_print_docs reads metadata.source, so small document sets rendered\nSource: None and reports hallucinated placeholder citations.\n\n(cherry picked from commit c0b3b04e17c220f0e485075f5b19e6bfef1468cc)",
          "is_bot": false,
          "headline": "fix(context): map url to source on compressor fast path",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T08:56:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17663ab6476b9daa27b2a92f5f2ce8729047aa78",
          "body": "Closes #1894.\n\nlangchain_community ArxivRetriever still calls removed Search.results()\non arxiv>=2.2, causing 100% scrape failure while abstracts still appear\nfrom the retriever. Call arxiv.Client().results() directly.\n\n(cherry picked from commit 269d1e940a82497ac2e0bd530ed174a561b3de1a)",
          "is_bot": false,
          "headline": "fix(scraper): fetch arXiv via Client API not Search.results",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T08:56:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb23f296fa6899ef11b8d784977e8b803fd38896",
          "body": "Treat non-dict/null openAccessPdf and non-list data as empty\nresults instead of AttributeError during result normalization.\n\n(cherry picked from commit ec06cf02e2897ca0ddd7f892cd5f120d5365aa7d)",
          "is_bot": false,
          "headline": "fix(retriever): guard Semantic Scholar openAccessPdf shapes",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T08:56:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a03261506fb5962bddc944287ee97b91d4d93e07",
          "body": "Skip non-dict / link-less organic hits instead of KeyError on\ntitle/link/snippet during result normalization.\n\n(cherry picked from commit 7736cd0e74f3f02442ee8a88456310a3ef1ce470)",
          "is_bot": false,
          "headline": "fix(retriever): guard Serper organic items against missing keys",
          "author_name": "Bartok9",
          "author_login": "Bartok9",
          "committed_at": "2026-07-14T08:56:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8604e1f158cf1c0a0b32ff9bd79b9f59667342b",
          "body": "Removed 'STORM-style' from the description of the research pipeline.",
          "is_bot": false,
          "headline": "Update README to remove 'STORM-style' reference",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-14T08:46:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a0a372829048090d153af99ccca2aca326be2ee",
          "body": "…angChain deep agent (#1857)\n\nDeep Agents example with benchmark suite. Builds on core fixes from #1861.",
          "is_bot": false,
          "headline": "Add Deep Agents example: GPT Researcher as the research engine in a L…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-13T07:56:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47bd8ab5fcbb295b07f16c1f5c1088c932430f3e",
          "body": "…d research pipeline robustness (#1861)\n\nCore pipeline fixes found during DeepResearch Bench benchmarking. Merges before #1857.",
          "is_bot": false,
          "headline": "Fix silently dropped token limits, real usage-based cost tracking, an…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-13T07:56:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd54bf9fd18f233ed1abebc3fc678f1d02acbf20",
          "body": "Nebius Token Factory exposes an OpenAI-compatible API for 60+ open models\n(DeepSeek, Qwen, Llama, Kimi, ...) and also hosts text-embedding models, so\nGPTR can run both its LLM and its embedding stack on a single provider.\n\n- llm_provider/generic/base.py: register \"nebius\" and add a ChatOpenAI\n  bran\n[…]\n and add a config section\n- tests: unit tests for registration, base-URL wiring, the override, and the\n  missing-key error path\n\nNo new dependencies (reuses langchain-openai). Auth via NEBIUS_API_KEY.",
          "is_bot": false,
          "headline": "feat: add Nebius Token Factory as LLM and embedding provider",
          "author_name": "Oren Levitin",
          "author_login": "teionarr",
          "committed_at": "2026-07-12T09:27:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6d0cf55af0eebf447649cf633c34ecd09c7965ae",
          "body": "…head\n\nBENCHMARK.md supporting results now cover SimpleQA parity, the blind\npairwise report comparison (GPTR preferred 5/8, more distinct sources) and\nthe hybrid private-docs study; FRAMES (n=20, within noise) is dropped. Raw\nartifacts behind every published table - official DRB RACE/FACT outputs,\np\n[…]\n, with the\nreport_benchmark.py harness committed for reproduction. README gains a\n\"Running the benchmarks\" section listing exactly what each run needs.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Track benchmark run artifacts and swap FRAMES for the report head-to-…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-05T14:51:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "20bd9569e31ecabe598845a348eec547a786a4a2",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Headline the hybrid benchmark's 94% peak coverage instead of the range",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-05T12:15:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "456764645b4090394c30f03eba84e50acb63db0f",
          "body": "…ne arm\n\nAnswers the fair objection that stock deepagents could read local docs via\nits own filesystem tools. Adds that arm, and replaces the 4-markdown-file\ntoy corpus with a generated realistic document share (27 files: fact docs\nas PDF/DOCX/markdown, department distractors, stale archived vintage\n[…]\nage,\nfile-tools DIY 62.5% avg (44-88%, cannot parse DOCX, sometimes trusts stale\nvintages), GPT Researcher hybrid 87.5% (81-94%) at equal web coverage.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Harden hybrid benchmark: realistic corpus and a DIY file-tools baseli…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-05T11:45:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "766861ac1e773c03ed91e141fa8ad267832d8a7a",
          "body": "…s coverage\n\nSimpleQA/FRAMES parity shows the heavier pipeline has no accuracy tax on\nsingle-fact lookups, and the hybrid benchmark (fictional internal corpus +\nreal market facts, LLM-judged per checkpoint) shows 95.9% vs 6.2% coverage\nof private-document facts at equal web coverage - a capability raw\nweb-search tooling cannot reach. Ships the reproducible hybrid harness and\ncorpus.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Add supporting benchmarks: Q&A accuracy parity and hybrid private-doc…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-05T11:04:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c58f50da3faf4b76b332528655548c91698b40a6",
          "body": "…ch deep agent\n\nBenchmarks the example against the deepagents quickstart setup (same harness,\nmodel, prompt and step budget; only the research tooling differs) on the\nofficial DeepResearch Bench RACE + FACT pipelines. GPT Researcher tools ground\nreports in 35.2 verified citations on average vs 18.6 \n[…]\nnAI judge backend and keyless-Jina fallback to the benchmark harness, and\nBENCHMARK.md with methodology and results, summarized in the README and docs.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Add DeepResearch Bench results: +89% verified citations over raw-sear…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-05T10:24:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5c1ce388d2c40843ab401060190eac4d7b0a2189",
          "body": "…ch pipeline robustness\n\n- Stop nulling max_tokens for no-temperature models (gpt-5.x/o-series):\n  langchain-openai maps it to max_completion_tokens, so output budgets now\n  actually apply. Raised default token limits to give reasoning models\n  headroom for reasoning tokens.\n- Cost tracking now pref\n[…]\nnt loop.\n- Prompt fixes: JSON typo in auto_agent_instructions example, contradictory\n  reference-list instruction, stale \"important to my career\" line.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Fix silently dropped token limits, real usage-based costs, and resear…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-05T09:20:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ee008fee27b9e1cf97bb63f342c051f234fcf5a2",
          "body": "…angChain deep agent\n\nAdds deep_agents/, a new multi-agent example where a chief-editor deep agent\nplans with todos, delegates sections to researcher subagents, and uses GPT\nResearcher via quick_search/deep_research tools (web, local or hybrid\nsources), with docs, a Docusaurus page and Mermaid suppo\n[…]\nnAI models to the gpt-5.4 family and fixes the Tavily retriever to\ntranslate site: operators into include_domains and respect the 400-char query\nlimit.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Add Deep Agents example: GPT Researcher as the research engine in a L…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-07-04T20:09:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "18d405166948e11b4a0304c0c4ec440bead9e4a5",
          "body": "security: sanitize untrusted content, add SECURITY.md, pin brotli",
          "is_bot": false,
          "headline": "Merge pull request #1820 from assafelovic/security/content-hardening",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-28T18:39:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3080b0c4abb71d9a1f85b3dc26c75eb730634280",
          "body": "Hardens against content-level issues that affect users running GPT-Researcher\nas intended (independent of who can reach the server):\n\n- Add SECURITY.md documenting the threat model (the backend is operator-run and\n  ships without built-in auth by design) and a private vulnerability-reporting\n  chann\n[…]\narlier versions\n  have no decompression size limit (CVE-2025-6176 decompression-bomb DoS).\n\nCloses #1719\nCloses #1659\nCloses #1819\nCloses #1103\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "security: sanitize untrusted content, add SECURITY.md, pin brotli",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-28T18:36:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "409b8b60b477d50f2f844bc9598d1bcb7b056eee",
          "body": "Fix Azure blob loader path handling",
          "is_bot": false,
          "headline": "Merge pull request #1817 from konnisan/fix-azure-blob-loader-paths",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-23T18:06:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06136d677e3dac5f726a35c9d7672d8bb7bc6daf",
          "body": "Update web_scraping.py",
          "is_bot": false,
          "headline": "Merge pull request #1816 from Joly0/main",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-23T18:05:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c13aeb66ec5c5ff12ceb33e0d9c93641e604532",
          "body": "feat: add Atlas Cloud as an OpenAI-compatible LLM provider",
          "is_bot": false,
          "headline": "Merge pull request #1813 from lucaszhu-hue/feat/add-atlascloud-provider",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-23T18:04:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e0b384482a9ed34d46def52af711916aca1bb35",
          "body": "Add GroundRoute retriever (multi-engine search, cached)",
          "is_bot": false,
          "headline": "Merge pull request #1812 from jp0xz/add-groundroute-retriever",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-23T18:02:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8bbfa86b013d7cc41a5dcd5d98c044c472554802",
          "body": "…actchecker-visualizer\n\nfeat: Add FactChecker and Visualizer Agents to Multi-Agent Workflow",
          "is_bot": false,
          "headline": "Merge pull request #1809 from KasraBashirioskooei/feat/multi-agents-f…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-23T18:01:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57152236ddfc3374f8ec193247a429125d96ca26",
          "body": "feat(retrievers): add fastCRW search retriever",
          "is_bot": false,
          "headline": "Merge pull request #1806 from us/feat/crw-retriever",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-23T17:58:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "347213cb916ab0c2bea17418f5574f9721a38118",
          "body": "fix(deep-research): keep oversized context from collapsing to empty",
          "is_bot": false,
          "headline": "Merge pull request #1802 from XiaojuCH/fix-deep-research-empty-context",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-23T17:57:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6968fb9555452964f04747c3b01d7a58e038102f",
          "body": "Abstain instead of fabricating a report when no content was gathered",
          "is_bot": false,
          "headline": "Merge pull request #1799 from aaravanmay/abstain-on-empty-context",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-23T17:57:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2b8e90ff94939e36a7071fac729242d39fd5f7d",
          "body": "feat(retrievers): add Brave Search support",
          "is_bot": false,
          "headline": "Merge pull request #1793 from agbocsardi/feature/brave-search-retriever",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-23T17:55:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc46fe6e9e9db4441cc0fadfdf9e073ec4307842",
          "body": "Improve SimpleQA eval observability with structured logging and latency metadata",
          "is_bot": false,
          "headline": "Merge pull request #1790 from SeanHe727/add-simpleqa-eval-logging",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-23T17:53:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1aa5a309bcd7e1851cc983f18456e15135303827",
          "body": "fix: add MAX_REVISIONS guard to prevent infinite revision loop",
          "is_bot": false,
          "headline": "Merge pull request #1783 from varshiniml7/main",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-06-23T17:51:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8c890d55c8a00ccd7085fb2a5d39f98d9fcee8c",
          "body": null,
          "is_bot": false,
          "headline": "Fix Azure blob loader path handling",
          "author_name": "konni",
          "author_login": "konnisan",
          "committed_at": "2026-06-23T06:57:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ed9dae528ee8eb474f0b8e9904a6273fd4ba282",
          "body": "Added code to close open requests.Session so its underlying connection pool (and the sockets it keeps alive) is released. A new Scraper/Session is created on every scrape batch; without this, the file descriptors accumulate over the lifetime of a long-running process (e.g. the gptr-mcp server) and eventually exhaust the open-file limit ([Errno 24] Too many open files), which breaks the server's ability to accept new connections.",
          "is_bot": false,
          "headline": "Update web_scraping.py",
          "author_name": "Joly0",
          "author_login": "Joly0",
          "committed_at": "2026-06-22T12:11:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2feeab15fdea6f75ba974698a97649512999b08",
          "body": null,
          "is_bot": false,
          "headline": "feat: add Atlas Cloud as an OpenAI-compatible LLM provider",
          "author_name": "lucaszhu-hue",
          "author_login": null,
          "committed_at": "2026-06-18T14:20:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffac13d72e6bdf2e6de218d900eda92c0b44237f",
          "body": "Opt-in retriever (RETRIEVER=groundroute) that POSTs to GroundRoute's search API and maps results to the standard {href, body} shape. No new dependency. Reads GROUNDROUTE_API_KEY.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add GroundRoute retriever (multi-engine search, cached)",
          "author_name": "AzioBeauty",
          "author_login": "jp0xz",
          "committed_at": "2026-06-16T17:41:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d5e453eeaf05df2e754b0641ca72be272e114c5c",
          "body": null,
          "is_bot": false,
          "headline": "feat: add FactChecker and Visualizer agents to multi-agent workflow",
          "author_name": "Kasra Bashirioskooei",
          "author_login": "KasraBashirioskooei",
          "committed_at": "2026-06-15T01:39:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "553b5e147272da02ad5debbfbd87439d5aab08b4",
          "body": "Adds fastCRW as a new web-search retriever (RETRIEVER=crw) alongside the\nexisting providers. fastCRW is a Firecrawl-compatible web data engine in a\nsingle binary; self-host (free) or managed cloud. Reads CRW_API_KEY and an\noptional CRW_API_URL for self-hosting. Additive only — no existing retriever\nis changed. Includes unit tests with mocked HTTP.",
          "is_bot": false,
          "headline": "feat(retrievers): add fastCRW search retriever",
          "author_name": "us",
          "author_login": "us",
          "committed_at": "2026-06-13T16:22:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69f57abfda816bd9acc8c41af82c442c8fb6b373",
          "body": null,
          "is_bot": false,
          "headline": "fix(deep-research): keep oversized context from collapsing to empty",
          "author_name": "Xiaoju",
          "author_login": "XiaojuCH",
          "committed_at": "2026-06-09T16:58:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d98728818c75717cb7ca801d9d83f675e69726e",
          "body": "ReportGenerator.write_report passed the gathered context straight to the report\nLLM with no check, so when every retriever returned empty (rate-limited, blocked,\nor no hits) it wrote a confident, sourced-looking report from the model's priors\n(including invented citations). Abstain with a clear message when no research\ncontent was gathered. Includes a regression test (mocks the report LLM).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Abstain instead of fabricating a report when no content was gathered",
          "author_name": "aaravanmay",
          "author_login": "aaravanmay",
          "committed_at": "2026-06-07T21:36:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "aa51eb782448d5642789ff66fd9542f7ec1d602d",
          "body": null,
          "is_bot": false,
          "headline": "feat(retrievers): add Brave Search support",
          "author_name": "A.G. Bocsardi",
          "author_login": "agbocsardi",
          "committed_at": "2026-06-01T17:59:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d45c2c7e610cba97f28b0162a2a5db9021ed58bd",
          "body": "…taset",
          "is_bot": false,
          "headline": "eval: add latency tracking, structured JSON logs, and multi-domain da…",
          "author_name": "CianHe727",
          "author_login": "SeanHe727",
          "committed_at": "2026-05-30T02:15:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "693d3b722c74b3f486643871f5044fced7802f58",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into main",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-05-28T07:07:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b364917f55ea579c47e5ef3f038f7e56f51213df",
          "body": "…-cost-tracking\n\nfeat(cost): track Anthropic usage from native metadata",
          "is_bot": false,
          "headline": "Merge pull request #1781 from RomainROCH/pr/feat-anthropic-real-usage…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-05-28T07:06:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5521508f364ed9d8f1251554ddcd4b061276ce00",
          "body": "…s-scraper\n\nfix(retrieval): send Brave snippets to scraper",
          "is_bot": false,
          "headline": "Merge pull request #1780 from RomainROCH/pr/fix-brave-snippet-bypasse…",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-05-28T07:06:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7cf6c43050f4e47cbf0902227188def269b65db1",
          "body": "Fix incorrect config file path in Chinese README",
          "is_bot": false,
          "headline": "Merge pull request #1779 from wesssI/fix/readme-config-path",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-05-28T07:05:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da31614a53b1b15db8ff0a14a3fc0ebb2b04d780",
          "body": "fix(llm): raise max_tokens cap from 32k to 200k for modern long-output models",
          "is_bot": false,
          "headline": "Merge pull request #1775 from RomainROCH/fix/max-tokens-32k-cap",
          "author_name": "Assaf Elovic",
          "author_login": "assafelovic",
          "committed_at": "2026-05-28T07:03:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 72,
      "commits_last_year": 372,
      "latest_release_at": "2026-07-18T07:56:56Z",
      "latest_release_tag": "v3.6.0",
      "releases_from_tags": false,
      "days_since_last_push": 8,
      "active_weeks_last_year": 46,
      "days_since_latest_release": 8,
      "mean_days_between_releases": 24
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 100,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "gpt-researcher",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/gpt-researcher/",
          "is_deprecated": false,
          "latest_version": "0.16.0",
          "repository_url": "https://github.com/assafelovic/gpt-researcher",
          "versions_count": 110,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 86471,
          "first_published_at": "2024-04-12T13:21:00.267680Z",
          "latest_published_at": "2026-07-18T08:04:08.440880Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 8
        }
      ]
    },
    "popularity": {
      "forks": 3866,
      "stars": 28654,
      "watchers": 168,
      "fork_history": {
        "days": [
          {
            "date": "2025-08-15",
            "count": 1
          },
          {
            "date": "2025-08-16",
            "count": 1
          },
          {
            "date": "2025-08-17",
            "count": 1
          },
          {
            "date": "2025-08-19",
            "count": 8
          },
          {
            "date": "2025-08-20",
            "count": 5
          },
          {
            "date": "2025-08-21",
            "count": 2
          },
          {
            "date": "2025-08-22",
            "count": 1
          },
          {
            "date": "2025-08-23",
            "count": 2
          },
          {
            "date": "2025-08-24",
            "count": 3
          },
          {
            "date": "2025-08-26",
            "count": 6
          },
          {
            "date": "2025-08-27",
            "count": 4
          },
          {
            "date": "2025-08-28",
            "count": 4
          },
          {
            "date": "2025-08-29",
            "count": 1
          },
          {
            "date": "2025-08-30",
            "count": 4
          },
          {
            "date": "2025-08-31",
            "count": 2
          },
          {
            "date": "2025-09-01",
            "count": 2
          },
          {
            "date": "2025-09-02",
            "count": 2
          },
          {
            "date": "2025-09-03",
            "count": 5
          },
          {
            "date": "2025-09-04",
            "count": 2
          },
          {
            "date": "2025-09-06",
            "count": 3
          },
          {
            "date": "2025-09-07",
            "count": 2
          },
          {
            "date": "2025-09-08",
            "count": 3
          },
          {
            "date": "2025-09-09",
            "count": 4
          },
          {
            "date": "2025-09-10",
            "count": 2
          },
          {
            "date": "2025-09-11",
            "count": 3
          },
          {
            "date": "2025-09-12",
            "count": 4
          },
          {
            "date": "2025-09-13",
            "count": 1
          },
          {
            "date": "2025-09-15",
            "count": 5
          },
          {
            "date": "2025-09-16",
            "count": 5
          },
          {
            "date": "2025-09-18",
            "count": 1
          },
          {
            "date": "2025-09-19",
            "count": 1
          },
          {
            "date": "2025-09-20",
            "count": 1
          },
          {
            "date": "2025-09-21",
            "count": 1
          },
          {
            "date": "2025-09-22",
            "count": 1
          },
          {
            "date": "2025-09-23",
            "count": 1
          },
          {
            "date": "2025-09-25",
            "count": 2
          },
          {
            "date": "2025-09-26",
            "count": 3
          },
          {
            "date": "2025-09-27",
            "count": 1
          },
          {
            "date": "2025-09-28",
            "count": 1
          },
          {
            "date": "2025-09-29",
            "count": 5
          },
          {
            "date": "2025-09-30",
            "count": 2
          },
          {
            "date": "2025-10-01",
            "count": 3
          },
          {
            "date": "2025-10-03",
            "count": 1
          },
          {
            "date": "2025-10-04",
            "count": 3
          },
          {
            "date": "2025-10-05",
            "count": 1
          },
          {
            "date": "2025-10-06",
            "count": 1
          },
          {
            "date": "2025-10-07",
            "count": 1
          },
          {
            "date": "2025-10-09",
            "count": 3
          },
          {
            "date": "2025-10-10",
            "count": 3
          },
          {
            "date": "2025-10-13",
            "count": 3
          },
          {
            "date": "2025-10-14",
            "count": 2
          },
          {
            "date": "2025-10-15",
            "count": 2
          },
          {
            "date": "2025-10-16",
            "count": 3
          },
          {
            "date": "2025-10-17",
            "count": 2
          },
          {
            "date": "2025-10-18",
            "count": 2
          },
          {
            "date": "2025-10-19",
            "count": 2
          },
          {
            "date": "2025-10-20",
            "count": 2
          },
          {
            "date": "2025-10-21",
            "count": 1
          },
          {
            "date": "2025-10-22",
            "count": 2
          },
          {
            "date": "2025-10-23",
            "count": 1
          },
          {
            "date": "2025-10-25",
            "count": 1
          },
          {
            "date": "2025-10-26",
            "count": 3
          },
          {
            "date": "2025-10-27",
            "count": 2
          },
          {
            "date": "2025-10-28",
            "count": 4
          },
          {
            "date": "2025-10-31",
            "count": 1
          },
          {
            "date": "2025-11-01",
            "count": 2
          },
          {
            "date": "2025-11-02",
            "count": 3
          },
          {
            "date": "2025-11-03",
            "count": 2
          },
          {
            "date": "2025-11-04",
            "count": 1
          },
          {
            "date": "2025-11-05",
            "count": 2
          },
          {
            "date": "2025-11-06",
            "count": 4
          },
          {
            "date": "2025-11-07",
            "count": 2
          },
          {
            "date": "2025-11-08",
            "count": 3
          },
          {
            "date": "2025-11-10",
            "count": 4
          },
          {
            "date": "2025-11-11",
            "count": 2
          },
          {
            "date": "2025-11-13",
            "count": 3
          },
          {
            "date": "2025-11-14",
            "count": 3
          },
          {
            "date": "2025-11-16",
            "count": 1
          },
          {
            "date": "2025-11-17",
            "count": 1
          },
          {
            "date": "2025-11-18",
            "count": 1
          },
          {
            "date": "2025-11-19",
            "count": 3
          },
          {
            "date": "2025-11-20",
            "count": 2
          },
          {
            "date": "2025-11-21",
            "count": 1
          },
          {
            "date": "2025-11-23",
            "count": 1
          },
          {
            "date": "2025-11-24",
            "count": 2
          },
          {
            "date": "2025-11-26",
            "count": 4
          },
          {
            "date": "2025-11-27",
            "count": 6
          },
          {
            "date": "2025-11-28",
            "count": 1
          },
          {
            "date": "2025-11-29",
            "count": 1
          },
          {
            "date": "2025-11-30",
            "count": 1
          },
          {
            "date": "2025-12-01",
            "count": 4
          },
          {
            "date": "2025-12-02",
            "count": 3
          },
          {
            "date": "2025-12-03",
            "count": 2
          },
          {
            "date": "2025-12-04",
            "count": 1
          },
          {
            "date": "2025-12-06",
            "count": 3
          },
          {
            "date": "2025-12-07",
            "count": 4
          },
          {
            "date": "2025-12-09",
            "count": 1
          },
          {
            "date": "2025-12-11",
            "count": 3
          },
          {
            "date": "2025-12-13",
            "count": 1
          },
          {
            "date": "2025-12-15",
            "count": 3
          },
          {
            "date": "2025-12-16",
            "count": 3
          },
          {
            "date": "2025-12-17",
            "count": 1
          },
          {
            "date": "2025-12-18",
            "count": 3
          },
          {
            "date": "2025-12-19",
            "count": 2
          },
          {
            "date": "2025-12-20",
            "count": 1
          },
          {
            "date": "2025-12-21",
            "count": 4
          },
          {
            "date": "2025-12-22",
            "count": 3
          },
          {
            "date": "2025-12-23",
            "count": 2
          },
          {
            "date": "2025-12-24",
            "count": 2
          },
          {
            "date": "2025-12-25",
            "count": 2
          },
          {
            "date": "2025-12-27",
            "count": 1
          },
          {
            "date": "2025-12-28",
            "count": 2
          },
          {
            "date": "2025-12-29",
            "count": 2
          },
          {
            "date": "2025-12-31",
            "count": 2
          },
          {
            "date": "2026-01-01",
            "count": 2
          },
          {
            "date": "2026-01-02",
            "count": 3
          },
          {
            "date": "2026-01-03",
            "count": 1
          },
          {
            "date": "2026-01-04",
            "count": 2
          },
          {
            "date": "2026-01-05",
            "count": 1
          },
          {
            "date": "2026-01-06",
            "count": 2
          },
          {
            "date": "2026-01-07",
            "count": 5
          },
          {
            "date": "2026-01-08",
            "count": 3
          },
          {
            "date": "2026-01-09",
            "count": 1
          },
          {
            "date": "2026-01-10",
            "count": 2
          },
          {
            "date": "2026-01-13",
            "count": 1
          },
          {
            "date": "2026-01-14",
            "count": 4
          },
          {
            "date": "2026-01-15",
            "count": 3
          },
          {
            "date": "2026-01-16",
            "count": 2
          },
          {
            "date": "2026-01-17",
            "count": 1
          },
          {
            "date": "2026-01-18",
            "count": 4
          },
          {
            "date": "2026-01-19",
            "count": 1
          },
          {
            "date": "2026-01-20",
            "count": 2
          },
          {
            "date": "2026-01-21",
            "count": 4
          },
          {
            "date": "2026-01-22",
            "count": 3
          },
          {
            "date": "2026-01-23",
            "count": 3
          },
          {
            "date": "2026-01-25",
            "count": 4
          },
          {
            "date": "2026-01-26",
            "count": 3
          },
          {
            "date": "2026-01-27",
            "count": 3
          },
          {
            "date": "2026-01-28",
            "count": 3
          },
          {
            "date": "2026-01-29",
            "count": 2
          },
          {
            "date": "2026-01-30",
            "count": 2
          },
          {
            "date": "2026-02-01",
            "count": 2
          },
          {
            "date": "2026-02-02",
            "count": 4
          },
          {
            "date": "2026-02-03",
            "count": 5
          },
          {
            "date": "2026-02-04",
            "count": 2
          },
          {
            "date": "2026-02-05",
            "count": 1
          },
          {
            "date": "2026-02-06",
            "count": 4
          },
          {
            "date": "2026-02-07",
            "count": 3
          },
          {
            "date": "2026-02-08",
            "count": 1
          },
          {
            "date": "2026-02-09",
            "count": 2
          },
          {
            "date": "2026-02-10",
            "count": 2
          },
          {
            "date": "2026-02-11",
            "count": 5
          },
          {
            "date": "2026-02-12",
            "count": 3
          },
          {
            "date": "2026-02-13",
            "count": 4
          },
          {
            "date": "2026-02-14",
            "count": 2
          },
          {
            "date": "2026-02-15",
            "count": 3
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-02-17",
            "count": 3
          },
          {
            "date": "2026-02-18",
            "count": 3
          },
          {
            "date": "2026-02-19",
            "count": 1
          },
          {
            "date": "2026-02-20",
            "count": 2
          },
          {
            "date": "2026-02-21",
            "count": 1
          },
          {
            "date": "2026-02-22",
            "count": 2
          },
          {
            "date": "2026-02-23",
            "count": 4
          },
          {
            "date": "2026-02-24",
            "count": 3
          },
          {
            "date": "2026-02-25",
            "count": 4
          },
          {
            "date": "2026-02-26",
            "count": 1
          },
          {
            "date": "2026-02-27",
            "count": 3
          },
          {
            "date": "2026-02-28",
            "count": 4
          },
          {
            "date": "2026-03-01",
            "count": 2
          },
          {
            "date": "2026-03-02",
            "count": 2
          },
          {
            "date": "2026-03-03",
            "count": 5
          },
          {
            "date": "2026-03-04",
            "count": 3
          },
          {
            "date": "2026-03-05",
            "count": 4
          },
          {
            "date": "2026-03-06",
            "count": 2
          },
          {
            "date": "2026-03-07",
            "count": 2
          },
          {
            "date": "2026-03-08",
            "count": 1
          },
          {
            "date": "2026-03-09",
            "count": 3
          },
          {
            "date": "2026-03-11",
            "count": 2
          },
          {
            "date": "2026-03-12",
            "count": 7
          },
          {
            "date": "2026-03-13",
            "count": 5
          },
          {
            "date": "2026-03-14",
            "count": 2
          },
          {
            "date": "2026-03-15",
            "count": 2
          },
          {
            "date": "2026-03-16",
            "count": 3
          },
          {
            "date": "2026-03-17",
            "count": 4
          },
          {
            "date": "2026-03-18",
            "count": 6
          },
          {
            "date": "2026-03-19",
            "count": 2
          },
          {
            "date": "2026-03-20",
            "count": 8
          },
          {
            "date": "2026-03-21",
            "count": 9
          },
          {
            "date": "2026-03-22",
            "count": 3
          },
          {
            "date": "2026-03-23",
            "count": 11
          },
          {
            "date": "2026-03-24",
            "count": 1
          },
          {
            "date": "2026-03-25",
            "count": 3
          },
          {
            "date": "2026-03-26",
            "count": 4
          },
          {
            "date": "2026-03-27",
            "count": 3
          },
          {
            "date": "2026-03-28",
            "count": 3
          },
          {
            "date": "2026-03-29",
            "count": 5
          },
          {
            "date": "2026-03-30",
            "count": 5
          },
          {
            "date": "2026-03-31",
            "count": 6
          },
          {
            "date": "2026-04-01",
            "count": 8
          },
          {
            "date": "2026-04-02",
            "count": 3
          },
          {
            "date": "2026-04-03",
            "count": 4
          },
          {
            "date": "2026-04-04",
            "count": 1
          },
          {
            "date": "2026-04-05",
            "count": 3
          },
          {
            "date": "2026-04-06",
            "count": 4
          },
          {
            "date": "2026-04-07",
            "count": 3
          },
          {
            "date": "2026-04-08",
            "count": 2
          },
          {
            "date": "2026-04-09",
            "count": 1
          },
          {
            "date": "2026-04-10",
            "count": 5
          },
          {
            "date": "2026-04-11",
            "count": 3
          },
          {
            "date": "2026-04-12",
            "count": 5
          },
          {
            "date": "2026-04-13",
            "count": 4
          },
          {
            "date": "2026-04-14",
            "count": 2
          },
          {
            "date": "2026-04-15",
            "count": 1
          },
          {
            "date": "2026-04-16",
            "count": 5
          },
          {
            "date": "2026-04-17",
            "count": 4
          },
          {
            "date": "2026-04-18",
            "count": 7
          },
          {
            "date": "2026-04-19",
            "count": 3
          },
          {
            "date": "2026-04-20",
            "count": 2
          },
          {
            "date": "2026-04-21",
            "count": 10
          },
          {
            "date": "2026-04-22",
            "count": 4
          },
          {
            "date": "2026-04-23",
            "count": 3
          },
          {
            "date": "2026-04-24",
            "count": 4
          },
          {
            "date": "2026-04-25",
            "count": 4
          },
          {
            "date": "2026-04-26",
            "count": 3
          },
          {
            "date": "2026-04-27",
            "count": 2
          },
          {
            "date": "2026-04-28",
            "count": 6
          },
          {
            "date": "2026-04-29",
            "count": 10
          },
          {
            "date": "2026-04-30",
            "count": 5
          },
          {
            "date": "2026-05-01",
            "count": 2
          },
          {
            "date": "2026-05-02",
            "count": 3
          },
          {
            "date": "2026-05-03",
            "count": 4
          },
          {
            "date": "2026-05-04",
            "count": 4
          },
          {
            "date": "2026-05-05",
            "count": 3
          },
          {
            "date": "2026-05-06",
            "count": 6
          },
          {
            "date": "2026-05-07",
            "count": 5
          },
          {
            "date": "2026-05-08",
            "count": 3
          },
          {
            "date": "2026-05-09",
            "count": 5
          },
          {
            "date": "2026-05-10",
            "count": 2
          },
          {
            "date": "2026-05-11",
            "count": 4
          },
          {
            "date": "2026-05-12",
            "count": 5
          },
          {
            "date": "2026-05-13",
            "count": 4
          },
          {
            "date": "2026-05-14",
            "count": 5
          },
          {
            "date": "2026-05-15",
            "count": 5
          },
          {
            "date": "2026-05-16",
            "count": 4
          },
          {
            "date": "2026-05-17",
            "count": 3
          },
          {
            "date": "2026-05-18",
            "count": 4
          },
          {
            "date": "2026-05-19",
            "count": 6
          },
          {
            "date": "2026-05-20",
            "count": 3
          },
          {
            "date": "2026-05-21",
            "count": 4
          },
          {
            "date": "2026-05-22",
            "count": 6
          },
          {
            "date": "2026-05-23",
            "count": 3
          },
          {
            "date": "2026-05-24",
            "count": 2
          },
          {
            "date": "2026-05-25",
            "count": 6
          },
          {
            "date": "2026-05-26",
            "count": 6
          },
          {
            "date": "2026-05-27",
            "count": 5
          },
          {
            "date": "2026-05-28",
            "count": 6
          },
          {
            "date": "2026-05-29",
            "count": 2
          },
          {
            "date": "2026-05-30",
            "count": 2
          },
          {
            "date": "2026-05-31",
            "count": 2
          },
          {
            "date": "2026-06-01",
            "count": 6
          },
          {
            "date": "2026-06-02",
            "count": 9
          },
          {
            "date": "2026-06-03",
            "count": 5
          },
          {
            "date": "2026-06-04",
            "count": 1
          },
          {
            "date": "2026-06-05",
            "count": 2
          },
          {
            "date": "2026-06-06",
            "count": 3
          },
          {
            "date": "2026-06-07",
            "count": 3
          },
          {
            "date": "2026-06-08",
            "count": 6
          },
          {
            "date": "2026-06-09",
            "count": 3
          },
          {
            "date": "2026-06-10",
            "count": 3
          },
          {
            "date": "2026-06-11",
            "count": 2
          },
          {
            "date": "2026-06-12",
            "count": 3
          },
          {
            "date": "2026-06-13",
            "count": 3
          },
          {
            "date": "2026-06-14",
            "count": 10
          },
          {
            "date": "2026-06-15",
            "count": 8
          },
          {
            "date": "2026-06-16",
            "count": 3
          },
          {
            "date": "2026-06-17",
            "count": 4
          },
          {
            "date": "2026-06-18",
            "count": 2
          },
          {
            "date": "2026-06-19",
            "count": 8
          },
          {
            "date": "2026-06-20",
            "count": 2
          },
          {
            "date": "2026-06-21",
            "count": 2
          },
          {
            "date": "2026-06-22",
            "count": 3
          },
          {
            "date": "2026-06-23",
            "count": 3
          },
          {
            "date": "2026-06-24",
            "count": 3
          },
          {
            "date": "2026-06-25",
            "count": 5
          },
          {
            "date": "2026-06-26",
            "count": 1
          },
          {
            "date": "2026-06-27",
            "count": 5
          },
          {
            "date": "2026-06-28",
            "count": 3
          },
          {
            "date": "2026-06-29",
            "count": 2
          },
          {
            "date": "2026-06-30",
            "count": 5
          },
          {
            "date": "2026-07-01",
            "count": 3
          },
          {
            "date": "2026-07-02",
            "count": 3
          },
          {
            "date": "2026-07-03",
            "count": 6
          },
          {
            "date": "2026-07-05",
            "count": 3
          },
          {
            "date": "2026-07-06",
            "count": 5
          },
          {
            "date": "2026-07-07",
            "count": 11
          },
          {
            "date": "2026-07-08",
            "count": 5
          },
          {
            "date": "2026-07-09",
            "count": 7
          },
          {
            "date": "2026-07-10",
            "count": 3
          },
          {
            "date": "2026-07-11",
            "count": 4
          },
          {
            "date": "2026-07-12",
            "count": 1
          },
          {
            "date": "2026-07-13",
            "count": 3
          },
          {
            "date": "2026-07-14",
            "count": 1
          },
          {
            "date": "2026-07-15",
            "count": 5
          },
          {
            "date": "2026-07-16",
            "count": 4
          },
          {
            "date": "2026-07-17",
            "count": 4
          },
          {
            "date": "2026-07-18",
            "count": 8
          },
          {
            "date": "2026-07-19",
            "count": 4
          },
          {
            "date": "2026-07-20",
            "count": 4
          },
          {
            "date": "2026-07-21",
            "count": 7
          },
          {
            "date": "2026-07-22",
            "count": 2
          },
          {
            "date": "2026-07-23",
            "count": 3
          },
          {
            "date": "2026-07-24",
            "count": 4
          },
          {
            "date": "2026-07-25",
            "count": 7
          },
          {
            "date": "2026-07-26",
            "count": 2
          }
        ],
        "complete": false,
        "collected": 1000,
        "total_forks": 3866
      },
      "star_history": null,
      "open_issues_and_prs": 142
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples",
        "notebooks"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [
        ".triage/engagement.graphql"
      ],
      "has_devcontainer": false,
      "typecheck_configs": [
        "frontend/nextjs/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 84260,
      "source_files_sampled": 367,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        ".cursorrules"
      ],
      "agent_instruction_max_bytes": 5937
    },
    "dependencies": {
      "manifests": [
        "backend/requirements.txt",
        "deep_agents/requirements.txt",
        "docs/package.json",
        "multi_agents/package.json",
        "multi_agents/requirements.txt",
        "pyproject.toml",
        "requirements.txt",
        "setup.py"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 159,
        "malicious_count": 0,
        "assessed_package": "pypi:gpt-researcher@0.16.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "@langchain/langgraph-sdk",
          "manifest": "multi_agents/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.0.1-rc.13"
        },
        {
          "name": "aiofiles",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=23.2.1"
        },
        {
          "name": "aiohappyeyeballs",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.6.1"
        },
        {
          "name": "aiohttp",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.12.0"
        },
        {
          "name": "aiosignal",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.3.2"
        },
        {
          "name": "annotated-types",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.7.0"
        },
        {
          "name": "anyio",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.9.0"
        },
        {
          "name": "arxiv",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0.0"
        },
        {
          "name": "attrs",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=25.3.0"
        },
        {
          "name": "backoff",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.2.1"
        },
        {
          "name": "beautifulsoup4",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.12.2"
        },
        {
          "name": "brotli",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.2.0"
        },
        {
          "name": "certifi",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2025.4.26"
        },
        {
          "name": "cffi",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.17.1"
        },
        {
          "name": "chardet",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.2.0"
        },
        {
          "name": "charset-normalizer",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.4.2"
        },
        {
          "name": "click",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=8.1.0"
        },
        {
          "name": "colorama",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.4.6"
        },
        {
          "name": "cryptography",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=45.0.2"
        },
        {
          "name": "cssselect2",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.8.0"
        },
        {
          "name": "dataclasses-json",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.6.7"
        },
        {
          "name": "distro",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.9.0"
        },
        {
          "name": "docopt",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.6.2"
        },
        {
          "name": "duckduckgo-search",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.1.1"
        },
        {
          "name": "emoji",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.14.1"
        },
        {
          "name": "fastapi",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.104.1"
        },
        {
          "name": "feedparser",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=6.0.11"
        },
        {
          "name": "filelock",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.18.0"
        },
        {
          "name": "filetype",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.2.0"
        },
        {
          "name": "fonttools",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.58.0"
        },
        {
          "name": "frozenlist",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.6.0"
        },
        {
          "name": "fsspec",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2025.5.1"
        },
        {
          "name": "greenlet",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.2.2"
        },
        {
          "name": "h11",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.16.0"
        },
        {
          "name": "html5lib",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.1"
        },
        {
          "name": "htmldocx",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.0.6"
        },
        {
          "name": "httpcore",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.9"
        },
        {
          "name": "httpx",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.28.1"
        },
        {
          "name": "httpx-aiohttp",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.1.4"
        },
        {
          "name": "httpx-sse",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.4.0"
        },
        {
          "name": "huggingface-hub",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.32.0"
        },
        {
          "name": "idna",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.10"
        },
        {
          "name": "importlib-metadata",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=8.7.0"
        },
        {
          "name": "jinja2",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.1.6"
        },
        {
          "name": "jiter",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.10.0"
        },
        {
          "name": "joblib",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.5.1"
        },
        {
          "name": "json-repair",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.44.0"
        },
        {
          "name": "json5",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.12.0"
        },
        {
          "name": "jsonpatch",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.33"
        },
        {
          "name": "jsonpointer",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.0.0"
        },
        {
          "name": "jsonschema",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.23.0"
        },
        {
          "name": "jsonschema-specifications",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2025.4.1"
        },
        {
          "name": "kiwisolver",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.4.5"
        },
        {
          "name": "langchain",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.0"
        },
        {
          "name": "langchain-classic",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.0"
        },
        {
          "name": "langchain-community",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.4.0"
        },
        {
          "name": "langchain-core",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.0"
        },
        {
          "name": "langchain-ollama",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.0"
        },
        {
          "name": "langchain-openai",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.0"
        },
        {
          "name": "langchain-text-splitters",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.0"
        },
        {
          "name": "langdetect",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.9"
        },
        {
          "name": "langgraph",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.2.76"
        },
        {
          "name": "langgraph-checkpoint",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0.26"
        },
        {
          "name": "langgraph-cli",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.2.10"
        },
        {
          "name": "langgraph-sdk",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.1.70"
        },
        {
          "name": "langsmith",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.3.42"
        },
        {
          "name": "litellm",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.71.0"
        },
        {
          "name": "loguru",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.7.3"
        },
        {
          "name": "lxml",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.4.0"
        },
        {
          "name": "markdown",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.8"
        },
        {
          "name": "markdown2",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.5.3"
        },
        {
          "name": "markupsafe",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.0.2"
        },
        {
          "name": "marshmallow",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.26.1"
        },
        {
          "name": "mcp",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.9.1"
        },
        {
          "name": "md2pdf",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.1"
        },
        {
          "name": "mistune",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.1.3"
        },
        {
          "name": "multidict",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=6.4.4"
        },
        {
          "name": "mypy-extensions",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.1.0"
        },
        {
          "name": "nest-asyncio",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.6.0"
        },
        {
          "name": "nltk",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.9.1"
        },
        {
          "name": "numpy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0.0,<2.3.0"
        },
        {
          "name": "olefile",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.47"
        },
        {
          "name": "ollama",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.4.8"
        },
        {
          "name": "openai",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.82.0"
        },
        {
          "name": "orjson",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.10.18"
        },
        {
          "name": "ormsgpack",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.10.0"
        },
        {
          "name": "packaging",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=24.2"
        },
        {
          "name": "pillow",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=11.2.1"
        },
        {
          "name": "primp",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.15.0"
        },
        {
          "name": "propcache",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.3.1"
        },
        {
          "name": "psutil",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=6.0.0"
        },
        {
          "name": "pycparser",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.22"
        },
        {
          "name": "pydantic",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.11.5"
        },
        {
          "name": "pydantic-core",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.33.2"
        },
        {
          "name": "pydantic-settings",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.9.1"
        },
        {
          "name": "pydyf",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.11.0"
        },
        {
          "name": "pymupdf",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.26.0"
        },
        {
          "name": "pypdf",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.5.0"
        },
        {
          "name": "pyphen",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.17.2"
        },
        {
          "name": "python-docx",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.1.2"
        },
        {
          "name": "python-dotenv",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.1.0"
        },
        {
          "name": "python-iso639",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2025.2.18"
        },
        {
          "name": "python-magic",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.4.27"
        },
        {
          "name": "python-multipart",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.0.20"
        },
        {
          "name": "python-oxmsg",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.0.2"
        },
        {
          "name": "pyyaml",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=6.0.2"
        },
        {
          "name": "rapidfuzz",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.13.0"
        },
        {
          "name": "referencing",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.36.2"
        },
        {
          "name": "regex",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2024.11.6"
        },
        {
          "name": "requests",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.32.3"
        },
        {
          "name": "requests-toolbelt",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.0"
        },
        {
          "name": "rpds-py",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.25.1"
        },
        {
          "name": "sgmllib3k",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.0"
        },
        {
          "name": "six",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.17.0"
        },
        {
          "name": "sniffio",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.3.1"
        },
        {
          "name": "soupsieve",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.7"
        },
        {
          "name": "sqlalchemy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0.41"
        },
        {
          "name": "sse-starlette",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.3.5"
        },
        {
          "name": "starlette",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.46.2"
        },
        {
          "name": "tenacity",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=9.1.2"
        },
        {
          "name": "tiktoken",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.9.0"
        },
        {
          "name": "tinycss2",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.4.0"
        },
        {
          "name": "tinyhtml5",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0.0"
        },
        {
          "name": "tokenizers",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.21.1"
        },
        {
          "name": "tqdm",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.67.1"
        },
        {
          "name": "typing-extensions",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=4.13.2"
        },
        {
          "name": "typing-inspect",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.9.0"
        },
        {
          "name": "typing-inspection",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.4.1"
        },
        {
          "name": "unstructured",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.17.2"
        },
        {
          "name": "unstructured-client",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.35.0"
        },
        {
          "name": "urllib3",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.4.0"
        },
        {
          "name": "uvicorn",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.34.2"
        },
        {
          "name": "weasyprint",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=65.1"
        },
        {
          "name": "webencodings",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.5.1"
        },
        {
          "name": "websockets",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=15.0.1"
        },
        {
          "name": "win32-setctime",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.2.0"
        },
        {
          "name": "wrapt",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.17.2"
        },
        {
          "name": "yarl",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.20.0"
        },
        {
          "name": "zipp",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.21.0"
        },
        {
          "name": "zopfli",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.2.3.post1"
        },
        {
          "name": "zstandard",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.23.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "@langchain/langgraph-sdk",
            "direct": true,
            "version": "^0.0.1-rc.12",
            "ecosystem": "npm"
          },
          {
            "name": "@langchain/langgraph-sdk",
            "direct": true,
            "version": "^0.0.1-rc.13",
            "ecosystem": "npm"
          },
          {
            "name": "aiofiles",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "aiohappyeyeballs",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "aiohttp",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "aiosignal",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "annotated-types",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "anyio",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "arxiv",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "attrs",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "backoff",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "beautifulsoup4",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "brotli",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "certifi",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "cffi",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "chardet",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "charset-normalizer",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "click",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "colorama",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "cryptography",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "cssselect2",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "dataclasses-json",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "distro",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "docopt",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "duckduckgo-search",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "emoji",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "fastapi",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "feedparser",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "filelock",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "filetype",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "fonttools",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "frozenlist",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "fsspec",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "greenlet",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "h11",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "html5lib",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "htmldocx",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "httpcore",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "httpx",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "httpx-aiohttp",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "httpx-sse",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "huggingface-hub",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "idna",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "importlib-metadata",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "jinja2",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "jiter",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "joblib",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "json-repair",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "json5",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "jsonpatch",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "jsonpointer",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "jsonschema",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "jsonschema-specifications",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "kiwisolver",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langchain",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langchain-classic",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langchain-community",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langchain-core",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langchain-ollama",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langchain-openai",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langchain-text-splitters",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langdetect",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langgraph",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langgraph-checkpoint",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langgraph-cli",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langgraph-sdk",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langsmith",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "litellm",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "loguru",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "lxml",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "markdown",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "markdown2",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "markupsafe",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "marshmallow",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "mcp",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "md2pdf",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "mistune",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "multidict",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "mypy-extensions",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "nest-asyncio",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "nltk",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "numpy",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "olefile",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ollama",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "openai",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "orjson",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ormsgpack",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "packaging",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pillow",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "primp",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "propcache",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "psutil",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pycparser",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pydantic",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pydantic-core",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pydantic-settings",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pydyf",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pymupdf",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pypdf",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyphen",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-docx",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-dotenv",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-iso639",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-magic",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-multipart",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-oxmsg",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyyaml",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "rapidfuzz",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "referencing",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "regex",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "requests",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "requests-toolbelt",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "rpds-py",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "sgmllib3k",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "six",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "sniffio",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "soupsieve",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "sqlalchemy",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "sse-starlette",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "starlette",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tenacity",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tiktoken",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tinycss2",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tinyhtml5",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tokenizers",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tqdm",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "typing-extensions",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "typing-inspect",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "typing-inspection",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "unstructured",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "unstructured-client",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "urllib3",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "uvicorn",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "weasyprint",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "webencodings",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "websockets",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "win32-setctime",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "wrapt",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "yarl",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "zipp",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "zopfli",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "zstandard",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "@babel/core",
            "direct": false,
            "version": "^7.26.9",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-flow",
            "direct": false,
            "version": "^7.26.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-typescript",
            "direct": false,
            "version": "^7.26.8",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/preset-env",
            "direct": false,
            "version": "^7.26.9",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/preset-react",
            "direct": false,
            "version": "^7.26.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/preset-typescript",
            "direct": false,
            "version": "^7.26.0",
            "ecosystem": "npm"
          },
          {
            "name": "@docusaurus/core",
            "direct": false,
            "version": "3.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@docusaurus/preset-classic",
            "direct": false,
            "version": "3.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@docusaurus/theme-mermaid",
            "direct": false,
            "version": "3.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@ducanh2912/next-pwa",
            "direct": false,
            "version": "^10.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@easyops-cn/docusaurus-search-local",
            "direct": false,
            "version": "^0.49.2",
            "ecosystem": "npm"
          },
          {
            "name": "@emotion/react",
            "direct": false,
            "version": "^11.10.5",
            "ecosystem": "npm"
          },
          {
            "name": "@emotion/styled",
            "direct": false,
            "version": "^11.10.5",
            "ecosystem": "npm"
          },
          {
            "name": "@mdx-js/react",
            "direct": false,
            "version": "^3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@mozilla/readability",
            "direct": false,
            "version": "^0.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@next/third-parties",
            "direct": false,
            "version": "^15.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-alias",
            "direct": false,
            "version": "^5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-babel",
            "direct": false,
            "version": "^6.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-commonjs",
            "direct": false,
            "version": "^28.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-json",
            "direct": false,
            "version": "^6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-node-resolve",
            "direct": false,
            "version": "^16.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-replace",
            "direct": false,
            "version": "^6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-typescript",
            "direct": false,
            "version": "^12.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@svgr/webpack",
            "direct": false,
            "version": "^8.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/typography",
            "direct": false,
            "version": "^0.5.16",
            "ecosystem": "npm"
          },
          {
            "name": "@types/jsdom",
            "direct": false,
            "version": "^21.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "^20",
            "ecosystem": "npm"
          },
          {
            "name": "@types/react",
            "direct": false,
            "version": "^18",
            "ecosystem": "npm"
          },
          {
            "name": "@types/react-dom",
            "direct": false,
            "version": "^18",
            "ecosystem": "npm"
          },
          {
            "name": "@types/uuid",
            "direct": false,
            "version": "^10.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "autoprefixer",
            "direct": false,
            "version": "^10.4.20",
            "ecosystem": "npm"
          },
          {
            "name": "axios",
            "direct": false,
            "version": "^1.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "clsx",
            "direct": false,
            "version": "^1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "date-fns",
            "direct": false,
            "version": "^4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "discord.js",
            "direct": false,
            "version": "^14.16.1",
            "ecosystem": "npm"
          },
          {
            "name": "dotenv",
            "direct": false,
            "version": "^16.4.5",
            "ecosystem": "npm"
          },
          {
            "name": "eslint",
            "direct": false,
            "version": "^8",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-config-next",
            "direct": false,
            "version": "14.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "eventsource-parser",
            "direct": false,
            "version": "^1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "express",
            "direct": false,
            "version": "^4.17.1",
            "ecosystem": "npm"
          },
          {
            "name": "file-loader",
            "direct": false,
            "version": "^6.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "framer-motion",
            "direct": false,
            "version": "^9.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "geist",
            "direct": false,
            "version": "^1.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "hast-util-is-element",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "isomorphic-dompurify",
            "direct": false,
            "version": "^3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "jsonrepair",
            "direct": false,
            "version": "^3.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "3.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "next",
            "direct": false,
            "version": "^14.2.28",
            "ecosystem": "npm"
          },
          {
            "name": "next-plausible",
            "direct": false,
            "version": "^3.12.0",
            "ecosystem": "npm"
          },
          {
            "name": "nodemon",
            "direct": false,
            "version": "^3.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "postcss",
            "direct": false,
            "version": "^8",
            "ecosystem": "npm"
          },
          {
            "name": "prettier",
            "direct": false,
            "version": "^3.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "prettier-plugin-tailwindcss",
            "direct": false,
            "version": "^0.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "react",
            "direct": false,
            "version": "^18.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "react",
            "direct": false,
            "version": "^18.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "react-dom",
            "direct": false,
            "version": "^18.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "react-dom",
            "direct": false,
            "version": "^18.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "react-dropzone",
            "direct": false,
            "version": "^14.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "react-ga4",
            "direct": false,
            "version": "^2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "react-hot-toast",
            "direct": false,
            "version": "^2.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "rehype-katex",
            "direct": false,
            "version": "7",
            "ecosystem": "npm"
          },
          {
            "name": "rehype-prism-plus",
            "direct": false,
            "version": "^2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "remark",
            "direct": false,
            "version": "^15.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "remark-gfm",
            "direct": false,
            "version": "^4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "remark-html",
            "direct": false,
            "version": "^16.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "remark-math",
            "direct": false,
            "version": "6",
            "ecosystem": "npm"
          },
          {
            "name": "remark-parse",
            "direct": false,
            "version": "^11.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "rollup",
            "direct": false,
            "version": "^2.79.2",
            "ecosystem": "npm"
          },
          {
            "name": "rollup-plugin-peer-deps-external",
            "direct": false,
            "version": "^2.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "rollup-plugin-postcss",
            "direct": false,
            "version": "^4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "rollup-plugin-terser",
            "direct": false,
            "version": "^7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "rollup-plugin-typescript2",
            "direct": false,
            "version": "^0.31.2",
            "ecosystem": "npm"
          },
          {
            "name": "tailwindcss",
            "direct": false,
            "version": "^3.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "trim",
            "direct": false,
            "version": "^0.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "^5",
            "ecosystem": "npm"
          },
          {
            "name": "url-loader",
            "direct": false,
            "version": "^4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "ws",
            "direct": false,
            "version": "^8.18.0",
            "ecosystem": "npm"
          },
          {
            "name": "zod",
            "direct": false,
            "version": "^3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "zod-to-json-schema",
            "direct": false,
            "version": "^3.23.0",
            "ecosystem": "npm"
          },
          {
            "name": "ag2",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ddgs",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "deepagents",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "google-genai",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "judges",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "langchain-mcp-adapters",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pandas",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-3-11",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "python-pptx",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tavily-python",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "types-aiofiles",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "types-beautifulsoup4",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "types-colorama",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "types-markdown",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "types-requests",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 236,
        "direct_count": 142,
        "indirect_count": 94
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 98,
        "merged_prs": 571,
        "open_issues": 44,
        "closed_ratio": 0.939,
        "closed_issues": 677,
        "closed_unmerged_prs": 390
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "assafelovic",
          "commits": 1513,
          "avatar_url": "https://avatars.githubusercontent.com/u/13554167?v=4"
        },
        {
          "type": "User",
          "login": "ElishaKay",
          "commits": 566,
          "avatar_url": "https://avatars.githubusercontent.com/u/16700452?v=4"
        },
        {
          "type": "User",
          "login": "rotemweiss57",
          "commits": 72,
          "avatar_url": "https://avatars.githubusercontent.com/u/91344214?v=4"
        },
        {
          "type": "User",
          "login": "ewgdg",
          "commits": 67,
          "avatar_url": "https://avatars.githubusercontent.com/u/15310401?v=4"
        },
        {
          "type": "User",
          "login": "Bartok9",
          "commits": 44,
          "avatar_url": "https://avatars.githubusercontent.com/u/259807879?v=4"
        },
        {
          "type": "User",
          "login": "kga245",
          "commits": 39,
          "avatar_url": "https://avatars.githubusercontent.com/u/74297?v=4"
        },
        {
          "type": "User",
          "login": "proy9714",
          "commits": 35,
          "avatar_url": "https://avatars.githubusercontent.com/u/37247296?v=4"
        },
        {
          "type": "User",
          "login": "gregdrizz",
          "commits": 28,
          "avatar_url": "https://avatars.githubusercontent.com/u/52860985?v=4"
        },
        {
          "type": "User",
          "login": "kesamet",
          "commits": 23,
          "avatar_url": "https://avatars.githubusercontent.com/u/8352701?v=4"
        },
        {
          "type": "User",
          "login": "oldrepublicwizard",
          "commits": 20,
          "avatar_url": "https://avatars.githubusercontent.com/u/2219836?v=4"
        }
      ],
      "contributors_sampled": 98,
      "top_contributor_share": 0.534
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "build.yml",
        "deploy.yml",
        "docker-build.yml",
        "llm-costs.yml",
        "plugin-quality-gate.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".eslintrc.json"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 8,
            "reason": "8 out of 9 merged PRs checked by a CI test -- score normalized to 8",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 1,
            "reason": "Found 1/9 approved changesets -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 13 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 18 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "5d84d2f5553e70a2765a8ff3a0d2672d60437ce8",
        "ran_at": "2026-07-27T00:32:44Z",
        "aggregate_score": 6.2,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-23T19:32:44Z",
      "oldest_open_prs": [
        {
          "number": 1007,
          "created_at": "2024-12-06T06:45:54Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1242,
          "created_at": "2025-03-08T07:09:38Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1588,
          "created_at": "2026-01-08T15:55:28Z",
          "last_comment_at": "2026-01-21T13:00:19Z",
          "last_comment_author": "assafelovic"
        },
        {
          "number": 1610,
          "created_at": "2026-01-30T03:28:43Z",
          "last_comment_at": "2026-05-28T06:53:32Z",
          "last_comment_author": "assafelovic"
        },
        {
          "number": 1612,
          "created_at": "2026-01-31T17:09:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1616,
          "created_at": "2026-01-31T17:12:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1671,
          "created_at": "2026-03-12T17:36:26Z",
          "last_comment_at": "2026-04-16T17:30:19Z",
          "last_comment_author": "assafelovic"
        },
        {
          "number": 1755,
          "created_at": "2026-04-28T03:09:44Z",
          "last_comment_at": "2026-06-24T06:10:24Z",
          "last_comment_author": "octo-patch"
        },
        {
          "number": 1756,
          "created_at": "2026-04-28T03:20:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1782,
          "created_at": "2026-05-21T13:06:32Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1786,
          "created_at": "2026-05-27T04:11:24Z",
          "last_comment_at": "2026-07-16T07:28:45Z",
          "last_comment_author": "feder-cr"
        },
        {
          "number": 1814,
          "created_at": "2026-06-21T18:17:39Z",
          "last_comment_at": "2026-06-29T19:22:22Z",
          "last_comment_author": "ilya-bogin-keenable"
        },
        {
          "number": 1818,
          "created_at": "2026-06-23T20:02:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1821,
          "created_at": "2026-06-26T17:39:19Z",
          "last_comment_at": "2026-07-02T18:28:39Z",
          "last_comment_author": "SeanHe727"
        },
        {
          "number": 1839,
          "created_at": "2026-06-29T06:10:36Z",
          "last_comment_at": "2026-07-14T12:16:55Z",
          "last_comment_author": "Bartok9"
        },
        {
          "number": 1849,
          "created_at": "2026-07-02T15:32:48Z",
          "last_comment_at": "2026-07-02T15:39:16Z",
          "last_comment_author": "axiom-of-choice"
        },
        {
          "number": 1850,
          "created_at": "2026-07-02T23:17:05Z",
          "last_comment_at": "2026-07-09T21:13:48Z",
          "last_comment_author": "TF-Caesar"
        },
        {
          "number": 1852,
          "created_at": "2026-07-03T06:08:56Z",
          "last_comment_at": "2026-07-14T12:16:34Z",
          "last_comment_author": "Bartok9"
        },
        {
          "number": 1853,
          "created_at": "2026-07-03T22:32:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1858,
          "created_at": "2026-07-05T00:56:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-14T13:13:34Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 1468,
          "created_at": "2025-07-21T09:06:53Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1483,
          "created_at": "2025-08-14T23:58:30Z",
          "last_comment_at": "2025-08-16T11:07:31Z",
          "last_comment_author": "assafelovic"
        },
        {
          "number": 1495,
          "created_at": "2025-09-04T04:09:44Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1502,
          "created_at": "2025-09-19T11:19:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1517,
          "created_at": "2025-09-29T09:51:03Z",
          "last_comment_at": "2025-09-30T17:42:54Z",
          "last_comment_author": "ElishaKay"
        },
        {
          "number": 1520,
          "created_at": "2025-09-29T16:50:51Z",
          "last_comment_at": "2026-07-17T21:21:33Z",
          "last_comment_author": "FlorianFranzen"
        },
        {
          "number": 1523,
          "created_at": "2025-09-30T16:18:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1526,
          "created_at": "2025-10-02T16:32:54Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1534,
          "created_at": "2025-10-16T19:14:59Z",
          "last_comment_at": "2025-12-01T15:31:11Z",
          "last_comment_author": "aclifton314"
        },
        {
          "number": 1572,
          "created_at": "2025-12-08T13:37:31Z",
          "last_comment_at": "2026-06-14T05:26:48Z",
          "last_comment_author": "Socialpranker"
        },
        {
          "number": 1575,
          "created_at": "2025-12-12T18:42:51Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1580,
          "created_at": "2025-12-16T11:38:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1581,
          "created_at": "2026-01-01T01:47:45Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1582,
          "created_at": "2026-01-05T10:37:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1586,
          "created_at": "2026-01-08T07:26:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1591,
          "created_at": "2026-01-12T04:47:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1602,
          "created_at": "2026-01-27T06:30:32Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1603,
          "created_at": "2026-01-28T02:05:01Z",
          "last_comment_at": "2026-01-28T19:14:58Z",
          "last_comment_author": "TheSpaceGod"
        },
        {
          "number": 1605,
          "created_at": "2026-01-28T19:07:19Z",
          "last_comment_at": "2026-01-28T19:51:53Z",
          "last_comment_author": "TheSpaceGod"
        },
        {
          "number": 1617,
          "created_at": "2026-01-31T20:35:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/assafelovic/gpt-researcher",
    "host": "github.com",
    "name": "gpt-researcher",
    "owner": "assafelovic"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 81,
      "inputs": {
        "security": 70,
        "vitality": 93,
        "community": 89,
        "governance": 67,
        "engineering": 84
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 93,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 89,
            "inputs": {
              "commits_last_year": 372,
              "human_commit_share": 1,
              "days_since_last_push": 8,
              "active_weeks_last_year": 46
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 8 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "46/52 weeks with commits",
                "points": 31.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 46
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "372 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 372
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 18 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 72,
              "latest_release_tag": "v3.6.0",
              "releases_from_tags": false,
              "days_since_latest_release": 8,
              "mean_days_between_releases": 24
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "72 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 72
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 8 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~24 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 24
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 12,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 12 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 12
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "excellent",
        "name": "Community & Adoption",
        "value": 89,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "excellent",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 97,
            "inputs": {
              "forks": 3866,
              "stars": 28654,
              "watchers": 168,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "28,654 stars",
                "points": 60,
                "status": "met",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 28654
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "3,866 forks",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 3866
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "168 watchers",
                "points": 12.4,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 168
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 82,
            "inputs": {
              "packages": [
                "gpt-researcher"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 86471
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "86,471 downloads/month across pypi",
                "points": 65.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 86471,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 67,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 43,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 98,
              "top_contributor_share": 0.534
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 53% of commits",
                "points": 10.5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 53
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "98 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 98
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 13 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "merged_prs": 571,
              "open_issues": 44,
              "closed_issues": 677,
              "issue_closed_ratio": 0.939,
              "closed_unmerged_prs": 390
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "94% of issues closed",
                "points": 43.9,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 94
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "571/961 decided PRs merged",
                "points": 22.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 571,
                      "decided": 961
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/9 approved changesets -- score normalized to 1",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 68,
            "inputs": {
              "followers": 1219,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "assafelovic",
              "public_repos": 23,
              "account_age_days": 4015
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "1,219 followers of assafelovic",
                "points": 22.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1219,
                      "login": "assafelovic"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "23 public repos, account ~11 yr old",
                "points": 22.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 23
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "gpt-researcher"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 8
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 8 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "110 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 110
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 84,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "5 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".eslintrc.json",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.json"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "8 out of 9 merged PRs checked by a CI test -- score normalized to 8",
                "points": 16,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "ai",
                "python",
                "agent",
                "automation",
                "research",
                "search",
                "webscraping",
                "llms",
                "deepresearch",
                "mcp",
                "mcp-server"
              ],
              "has_wiki": false,
              "homepage": "https://gptr.dev",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://gptr.dev",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "11 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "good",
        "name": "Security",
        "value": 70,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 62,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 6.2
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "8 out of 9 merged PRs checked by a CI test -- score normalized to 8",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 1/9 approved changesets -- score normalized to 1",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 13 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 18 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the pypi:gpt-researcher@0.16.0 runtime dependency closure — what installing the published package pulls in — 159 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "pypi:gpt-researcher@0.16.0",
                  "assessed": 159
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 159,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 159,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 80,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.95,
              "agent_instruction_files": [
                ".cursorrules"
              ],
              "agent_instruction_max_bytes": 5937
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".cursorrules",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".cursorrules"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "95 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 95,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 69,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "frontend/nextjs/tsconfig.json"
              ],
              "agent_commit_share": 0.13,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".eslintrc.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "frontend/nextjs/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "frontend/nextjs/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "13 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 13,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "dependency automation configured, none observed in the sampled commits",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "dependency_bot_config_only",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 84260,
              "source_files_sampled": 367,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (frontend/nextjs/tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "frontend/nextjs/tsconfig.json",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/367 source files over 60KB",
                "points": 54.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 367,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "excellent",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "example_dirs": [
                "examples",
                "notebooks"
              ],
              "has_mcp_signal": true,
              "api_schema_files": [
                ".triage/engagement.graphql"
              ]
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": ".triage/engagement.graphql",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".triage/engagement.graphql"
                    }
                  }
                ],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples, notebooks",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples, notebooks"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Could not fetch npm package 'simple_js_test' from its registry"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T00:33:25.772155Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/assafelovic/gpt-researcher.svg",
  "full_name": "assafelovic/gpt-researcher",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsPyPI.