"""**sys_info** prints information about the system and langchain packagesfor debugging purposes."""fromcollections.abcimportSequencedef_get_sub_deps(packages:Sequence[str])->list[str]:"""Get any specified sub-dependencies."""fromimportlibimportmetadatasub_deps=set()_underscored_packages={pkg.replace("-","_")forpkginpackages}forpkginpackages:try:required=metadata.requires(pkg)exceptmetadata.PackageNotFoundError:continueifnotrequired:continueforreqinrequired:try:cleaned_req=req.split(" ")[0]exceptException:# In case parsing of requirement spec failscontinueifcleaned_req.replace("-","_")notin_underscored_packages:sub_deps.add(cleaned_req)returnsorted(sub_deps,key=lambdax:x.lower())
[docs]defprint_sys_info(*,additional_pkgs:Sequence[str]=())->None:"""Print information about the environment for debugging purposes. Args: additional_pkgs: Additional packages to include in the output. """importpkgutilimportplatformimportsysfromimportlibimportmetadata,util# Packages that do not start with "langchain" prefix.other_langchain_packages=["langserve","langsmith",]langchain_pkgs=[namefor_,name,_inpkgutil.iter_modules()ifname.startswith("langchain")]langgraph_pkgs=[namefor_,name,_inpkgutil.iter_modules()ifname.startswith("langgraph")]all_packages=sorted(set(langchain_pkgs+langgraph_pkgs+other_langchain_packages+list(additional_pkgs)))# Always surface these packages to the toporder_by=["langchain_core","langchain","langchain_community","langsmith"]forpkginreversed(order_by):ifpkginall_packages:all_packages.remove(pkg)all_packages=[pkg]+list(all_packages)system_info={"OS":platform.system(),"OS Version":platform.version(),"Python Version":sys.version,}print()# noqa: T201print("System Information")# noqa: T201print("------------------")# noqa: T201print("> OS: ",system_info["OS"])# noqa: T201print("> OS Version: ",system_info["OS Version"])# noqa: T201print("> Python Version: ",system_info["Python Version"])# noqa: T201# Print out only langchain packagesprint()# noqa: T201print("Package Information")# noqa: T201print("-------------------")# noqa: T201not_installed=[]forpkginall_packages:try:found_package=util.find_spec(pkg)exceptException:found_package=Noneiffound_packageisNone:not_installed.append(pkg)continue# Package versiontry:package_version=metadata.version(pkg)exceptException:package_version=None# Print package with versionifpackage_versionisnotNone:print(f"> {pkg}: {package_version}")# noqa: T201else:print(f"> {pkg}: Installed. No version info available.")# noqa: T201ifnot_installed:print()# noqa: T201print("Optional packages not installed")# noqa: T201print("-------------------------------")# noqa: T201forpkginnot_installed:print(f"> {pkg}")# noqa: T201sub_dependencies=_get_sub_deps(all_packages)ifsub_dependencies:print()# noqa: T201print("Other Dependencies")# noqa: T201print("------------------")# noqa: T201fordepinsub_dependencies:try:dep_version=metadata.version(dep)print(f"> {dep}: {dep_version}")# noqa: T201exceptException:print(f"> {dep}: Installed. No version info available.")# noqa: T201