{"record":{"id":"6d3cfe7caca11dc8","repo":"JuliusBrussee/caveman","slug":"install-caveman-middleware-langchain-to-use-the-langchain","errorCode":null,"errorMessage":"Install caveman-middleware[langchain] to use the LangChain adapter","messagePattern":"Install caveman-middleware\\[langchain\\] to use the LangChain adapter","errorType":"exception","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"packages/middleware/python/caveman_middleware/langchain.py","lineNumber":21,"sourceCode":"\nimport functools\nimport asyncio\nimport copy\nimport json\nimport uuid\nfrom dataclasses import asdict\nfrom contextlib import aclosing\n\ntry:\n    from langchain.agents.middleware import AgentMiddleware\n    from langchain_core.documents import Document, BaseDocumentCompressor\n    from langchain_core.language_models import BaseChatModel\n    from langchain_core.messages import BaseMessage, ToolMessage, convert_to_messages\n    from langchain_core.prompt_values import PromptValue\n    from langchain_core.runnables import RunnableConfig, ensure_config\n    from langchain_core.tools import StructuredTool\nexcept ModuleNotFoundError as error:\n    raise ImportError(\"Install caveman-middleware[langchain] to use the LangChain adapter\") from error\n\nfrom caveman_cloud.middleware import Adapter, Candidate, Scope, MiddlewareRuntime, RecoveryBinding\nfrom caveman_cloud.middleware.runtime import RECOVERY_DESCRIPTION, RECOVERY_SCHEMA\nfrom ._native import Attempt, manifest, owner, plain\nfrom ._versions import matches_framework\n\nADAPTER = Adapter(\"langchain\", \"0.1.0\", \"1.4.0\", \"langchain-message-v1\")\n\n\ndef scope_from_config(config: RunnableConfig, *, namespace: str) -> Scope:\n    \"\"\"Use the caller's checkpoint thread and explicit branch/epoch identity.\"\"\"\n    values = config.get(\"configurable\", {})\n    thread = values.get(\"thread_id\")\n    if not isinstance(thread, str) or not thread:\n        raise ValueError(\"LangGraph middleware requires a nonempty configurable.thread_id\")\n    return Scope(namespace, thread, values.get(\"caveman_branch_id\", \"main\"), values.get(\"caveman_cache_epoch\", \"0\"))\n\n","sourceCodeStart":3,"sourceCodeEnd":39,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/3ee70a102609e550bd2e68004bf5990a9341c851/packages/middleware/python/caveman_middleware/langchain.py#L3-L39","documentation":"The LangChain adapter imports langchain_core at module import time and converts ModuleNotFoundError into this ImportError. It exists so users get a clear instruction instead of a raw langchain_core traceback. The optional extra 'langchain' bundles langchain-core as a dependency.","triggerScenarios":"importing caveman_middleware.langchain (or any of its adapters) while langchain_core is not installed in the current environment.","commonSituations":"Installed caveman-middleware without [langchain] extra; deployed to a slim container image that pruned LangChain; running with a different virtualenv/interpreter than the one where LangChain was installed.","solutions":["pip install 'caveman-middleware[langchain]'","Or install langchain-core directly: pip install langchain-core","Verify the same interpreter/venv is used (pip show langchain-core; which python)."],"exampleFix":"// before\npip install caveman-middleware\nimport caveman_middleware.langchain  # ImportError\n// after\npip install 'caveman-middleware[langchain]'\nimport caveman_middleware.langchain  # ok","handlingStrategy":"try-catch","validationCode":"import importlib.util\nif importlib.util.find_spec('langchain_core') is None:\n    raise SystemExit(\"Install with: pip install 'caveman-middleware[langchain]'\")","typeGuard":null,"tryCatchPattern":"try:\n    from caveman_middleware import langchain as caveman_langchain\nexcept ImportError:\n    raise SystemExit(\"Missing optional dependency. Run: pip install 'caveman-middleware[langchain]'\")","preventionTips":["Always install with extras: pip install 'caveman-middleware[langchain]'.","Pin dependencies in requirements files including extras.","Add a CI smoke test that imports the adapter modules for every deployment image."],"tags":["missing-dependency","import","langchain","python"],"backgroundTag":"missing-optional-dependency","analyzedSha":"3ee70a102609e550bd2e68004bf5990a9341c851","analyzedAt":"2026-09-20T15:53:39.229Z","contentChangedAt":"2026-09-20T15:53:39.229Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}