diff --git a/docs/_scripts/third_party_page/create_third_party_page.py b/docs/_scripts/third_party_page/create_third_party_page.py index 41d113bb2..fd3f784af 100755 --- a/docs/_scripts/third_party_page/create_third_party_page.py +++ b/docs/_scripts/third_party_page/create_third_party_page.py @@ -89,7 +89,7 @@ def generate_markdown(resolved_packages: List[ResolvedPackage], language: str) - for package in sorted_packages: name = f"**{package['name']}**" repo_url = f"[{package['repo']}](https://github.com/{package['repo']})" - downloads = package["weekly_downloads"] or 0 + downloads = package["weekly_downloads"] or "-" row = f"| {name} | {repo_url} | {package['description']} | {downloads} |" rows.append(row) markdown_content = MARKDOWN.format( diff --git a/docs/_scripts/third_party_page/get_download_stats.py b/docs/_scripts/third_party_page/get_download_stats.py index 1bd027341..81b6b515f 100755 --- a/docs/_scripts/third_party_page/get_download_stats.py +++ b/docs/_scripts/third_party_page/get_download_stats.py @@ -35,20 +35,45 @@ def _get_weekly_downloads(packages: list[Package]) -> list[ResolvedPackage]: resolved_packages: list[ResolvedPackage] = [] for package in packages: - url = f"https://pypistats.org/api/packages/{package['name']}/overall" + # First check if package exists on PyPI + pypi_url = f"https://pypi.org/pypi/{package['name']}/json" + try: + pypi_response = requests.get(pypi_url) + pypi_response.raise_for_status() + except requests.exceptions.HTTPError: + raise AssertionError(f"Package {package['name']} does not exist on PyPI") - response = requests.get(url) - response.raise_for_status() - data = response.json() + # Get first release date + pypi_data = pypi_response.json() + releases = pypi_data["releases"] + first_release_date = None + for version_releases in releases.values(): + if version_releases: # Some versions may be empty lists + upload_time = datetime.fromisoformat(version_releases[0]["upload_time"]) + if first_release_date is None or upload_time < first_release_date: + first_release_date = upload_time - sorted_data = sorted( - data["data"], - key=lambda x: datetime.strptime(x["date"], "%Y-%m-%d"), - reverse=True, - ) + if first_release_date is None: + raise AssertionError(f"Package {package['name']} has no releases yet") - # Sum the last 7 days of downloads - num_downloads = sum(entry["downloads"] for entry in sorted_data[:7]) + # If package was published in last 48 hours, skip download stats + if (datetime.now() - first_release_date).total_seconds() >= 48 * 3600: + url = f"https://pypistats.org/api/packages/{package['name']}/overall" + + response = requests.get(url) + response.raise_for_status() + data = response.json() + + sorted_data = sorted( + data["data"], + key=lambda x: datetime.strptime(x["date"], "%Y-%m-%d"), + reverse=True, + ) + + # Sum the last 7 days of downloads + num_downloads = sum(entry["downloads"] for entry in sorted_data[:7]) + else: + num_downloads = None resolved_packages.append( { diff --git a/docs/_scripts/third_party_page/packages.yml b/docs/_scripts/third_party_page/packages.yml index b7746bd2a..518b5f5d9 100644 --- a/docs/_scripts/third_party_page/packages.yml +++ b/docs/_scripts/third_party_page/packages.yml @@ -12,3 +12,6 @@ packages: - name: "langmem" repo: "langchain-ai/langmem" description: "Build agents that learn and adapt from interactions over time." + - name: "langchain-mcp-adapters" + repo: "langchain-ai/langchain-mcp-adapters" + description: "Make Anthropic Model Context Protocol (MCP) tools compatible with LangGraph agents." \ No newline at end of file diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index ac73e9e34..fe6907c48 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -355,6 +355,7 @@ nav: - tutorials/auth/resource_auth.md - tutorials/auth/add_auth_server.md - Resources: + # NOTE: prebuilt.md is auto-generated by `make build-prebuilt` - Prebuilt Agents: prebuilt.md - Adopters: adopters.md - FAQ: concepts/faq.md