From 48ab91b520eec910f0592f1ae7fb8fdfb8d3b93e Mon Sep 17 00:00:00 2001
From: Erick Friis <erick@langchain.dev>
Date: Thu, 12 Dec 2024 19:07:24 -0800
Subject: [PATCH] docs: more useful vercel warnings (#28699)

---
 docs/Makefile                                | 19 +++----
 docs/scripts/generate_api_reference_links.py | 53 ++++++++++++++++----
 docs/scripts/partner_deps_list.py            | 26 ++++++++++
 docs/vercel_requirements.txt                 |  5 --
 libs/packages.yml                            |  4 +-
 5 files changed, 76 insertions(+), 31 deletions(-)
 create mode 100644 docs/scripts/partner_deps_list.py

diff --git a/docs/Makefile b/docs/Makefile
index 107bb1feb4d..5df104397aa 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -13,28 +13,21 @@ OUTPUT_NEW_DOCS_DIR = $(OUTPUT_NEW_DIR)/docs
 
 PYTHON = .venv/bin/python
 
-PARTNER_DEPS_LIST := $(shell find ../libs/partners -mindepth 1 -maxdepth 1 -type d -exec sh -c ' \
-for dir; do \
-    if find "$$dir" -maxdepth 1 -type f \( -name "pyproject.toml" -o -name "setup.py" \) | grep -q .; then \
-        echo "$$dir"; \
-    fi \
-done' sh {} + | grep -vE "airbyte|ibm|databricks" | tr '\n' ' ')
-
 PORT ?= 3001
 
 clean:
 	rm -rf build
 
 install-vercel-deps:
-	yum -y update
-	yum install gcc bzip2-devel libffi-devel zlib-devel wget tar gzip rsync -y
+	yum -y -q update
+	yum -y -q install gcc bzip2-devel libffi-devel zlib-devel wget tar gzip rsync -y
 
 install-py-deps:
 	python3 -m venv .venv
-	$(PYTHON) -m pip install --upgrade pip
-	$(PYTHON) -m pip install --upgrade uv
-	$(PYTHON) -m uv pip install --pre -r vercel_requirements.txt
-	$(PYTHON) -m uv pip install --pre --editable $(PARTNER_DEPS_LIST)
+	$(PYTHON) -m pip install -q --upgrade pip
+	$(PYTHON) -m pip install -q --upgrade uv
+	$(PYTHON) -m uv pip install -q --pre -r vercel_requirements.txt
+	$(PYTHON) -m uv pip install -q --pre $$($(PYTHON) scripts/partner_deps_list.py)
 
 generate-files:
 	mkdir -p $(INTERMEDIATE_DIR)
diff --git a/docs/scripts/generate_api_reference_links.py b/docs/scripts/generate_api_reference_links.py
index 662d1dd12f7..dd9ba388c31 100644
--- a/docs/scripts/generate_api_reference_links.py
+++ b/docs/scripts/generate_api_reference_links.py
@@ -5,6 +5,7 @@ import json
 import logging
 import os
 import re
+import warnings
 from pathlib import Path
 from typing import List, Literal, Optional
 
@@ -110,16 +111,36 @@ def find_files(path):
 
 def get_full_module_name(module_path, class_name) -> Optional[str]:
     """Get full module name using inspect"""
-    try:
-        module = importlib.import_module(module_path)
-        class_ = getattr(module, class_name)
-        return inspect.getmodule(class_).__name__
-    except AttributeError as e:
-        logger.warning(f"Could not find module for {class_name}, {e}")
-        return None
-    except ImportError as e:
-        logger.warning(f"Failed to load for class {class_name}, {e}")
-        return None
+    with warnings.catch_warnings():
+        warnings.simplefilter("ignore")
+        try:
+            module = importlib.import_module(module_path)
+        except ImportError:
+            # check if it's a submodule
+            try:
+                module = importlib.import_module(module_path + "." + class_name)
+            except ImportError:
+                raise ValueError(f"Failed to import module {module_path}")
+            return module.__name__
+
+        try:
+            class_ = getattr(module, class_name)
+        except AttributeError:
+            # check if it's a submodule
+            try:
+                module = importlib.import_module(module_path + "." + class_name)
+            except ImportError:
+                raise ValueError(
+                    f"Failed to import class {class_name} from module {module_path}"
+                )
+            return module.__name__
+
+        inspectmodule = inspect.getmodule(class_)
+        if inspectmodule is None:
+            # it wasn't a class, it's a primitive (e.g. END="__end__")
+            # so no documentation link is necessary
+            return None
+        return inspectmodule.__name__
 
 
 def get_args() -> argparse.Namespace:
@@ -228,7 +249,17 @@ def _get_imports(
             if imp.strip()
         ]
         for class_name in imported_classes:
-            module_path = get_full_module_name(module, class_name)
+            try:
+                module_path = get_full_module_name(module, class_name)
+            except ValueError as e:
+                logger.warning(e)
+                continue
+            except Exception as e:
+                logger.error(
+                    f"Failed to get full module name for {module}.{class_name}"
+                )
+                logger.error(e)
+                continue
             if not module_path:
                 continue
             if len(module_path.split(".")) < 2:
diff --git a/docs/scripts/partner_deps_list.py b/docs/scripts/partner_deps_list.py
new file mode 100644
index 00000000000..2103619f5b0
--- /dev/null
+++ b/docs/scripts/partner_deps_list.py
@@ -0,0 +1,26 @@
+import yaml
+
+if __name__ == "__main__":
+    with open("../libs/packages.yml", "r") as f:
+        packages_yaml = yaml.safe_load(f)
+
+    packages = packages_yaml["packages"]
+
+    comaintain_packages = [
+        p
+        for p in packages
+        if not p.get("disabled", False)
+        and p["repo"].startswith("langchain-ai/")
+        and p["repo"] != "langchain-ai/langchain"
+    ]
+    monorepo_packages = [
+        p
+        for p in packages
+        if not p.get("disabled", False) and p["repo"] == "langchain-ai/langchain"
+    ]
+
+    for p in monorepo_packages:
+        print("--editable ../" + p["path"])
+
+    for p in comaintain_packages:
+        print(p["name"])
diff --git a/docs/vercel_requirements.txt b/docs/vercel_requirements.txt
index 66cd83bf0c3..b4a7d5d070b 100644
--- a/docs/vercel_requirements.txt
+++ b/docs/vercel_requirements.txt
@@ -1,10 +1,5 @@
--e ../libs/core
--e ../libs/langchain
--e ../libs/community
--e ../libs/text-splitters
 langgraph
 pyyaml
-langchain-cohere
 urllib3==1.26.19
 nbconvert==7.16.4
 
diff --git a/libs/packages.yml b/libs/packages.yml
index 7d995ec5d63..77e6b15a7c5 100644
--- a/libs/packages.yml
+++ b/libs/packages.yml
@@ -42,8 +42,8 @@ packages:
     repo: langchain-ai/langchain
     path: libs/partners/huggingface
   - name: langchain-ibm
-    repo: langchain-ai/langchain
-    path: libs/partners/ibm
+    repo: langchain-ai/langchain-ibm
+    path: libs/ibm
   - name: langchain-milvus
     repo: langchain-ai/langchain-milvus
     path: libs/milvus