{"record":{"id":"e8d9dcbb619752b7","repo":"JuliusBrussee/caveman","slug":"install-caveman-middleware-pydantic-ai-to-use-the-pydantic","errorCode":null,"errorMessage":"Install caveman-middleware[pydantic-ai] to use the Pydantic AI adapter","messagePattern":"Install caveman-middleware\\[pydantic-ai\\] to use the Pydantic AI adapter","errorType":"exception","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"packages/middleware/python/caveman_middleware/pydantic_ai.py","lineNumber":25,"sourceCode":"import uuid\nfrom contextlib import asynccontextmanager\nfrom dataclasses import replace\nfrom importlib.metadata import version\nfrom typing import Any\n\ntry:\n    from pydantic_ai import RunContext, Tool\n    from pydantic_ai.capabilities import AbstractCapability\n    from pydantic_ai.messages import (\n        ModelMessage, ModelMessagesTypeAdapter, ModelRequest, ModelResponse,\n        ToolCallPart, ToolReturnPart,\n    )\n    from pydantic_ai.models import Model, ModelRequestContext, ModelRequestParameters\n    from pydantic_ai.models.wrapper import WrapperModel\n    from pydantic_ai.toolsets import FunctionToolset\n    from pydantic_core import PydanticSerializationError\nexcept ModuleNotFoundError as error:\n    raise ImportError(\"Install caveman-middleware[pydantic-ai] to use the Pydantic AI adapter\") from error\n\nfrom caveman_cloud.middleware import Adapter, Candidate, MiddlewareError, MiddlewareRuntime, Scope\nfrom caveman_cloud.middleware.runtime import RECOVERY_DESCRIPTION, RECOVERY_SCHEMA\nfrom ._native import Attempt, manifest, owner\nfrom ._versions import supports_framework\n\nADAPTER = Adapter(\"pydantic-ai\", \"0.1.0\", \"2.42.0\", \"pydantic-ai-message-v1\")\n\n\ndef scope_from_run(ctx: RunContext, *, namespace: str) -> Scope:\n    \"\"\"Use native conversation identity plus application-owned branch metadata.\"\"\"\n    if not isinstance(ctx.conversation_id, str) or not ctx.conversation_id:\n        raise ValueError(\"Pydantic AI middleware requires a native conversation_id\")\n    metadata = ctx.metadata or {}\n    return Scope(namespace, ctx.conversation_id, metadata.get(\"caveman_branch_id\", \"main\"),\n                 metadata.get(\"caveman_cache_epoch\", \"0\"))\n\n","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/3ee70a102609e550bd2e68004bf5990a9341c851/packages/middleware/python/caveman_middleware/pydantic_ai.py#L7-L43","documentation":"The Pydantic AI adapter is an optional extra of caveman-middleware. At import time the module tries to import pydantic_ai; if the package is absent it converts the ModuleNotFoundError into an actionable ImportError telling you which extra to install.","triggerScenarios":"importing caveman_middleware.pydantic_ai (or anything that imports it) in an environment where the pydantic_ai distribution is not installed, e.g. after `pip install caveman-middleware` without extras.","commonSituations":"Fresh CI or container images built without optional extras; deploying to a slim runtime image that omits dev dependencies; a dependency bump that dropped the [pydantic-ai] extra.","solutions":["Run `pip install 'caveman-middleware[pydantic-ai]'`","If you do not use Pydantic AI, remove the import of caveman_middleware.pydantic_ai from your code path","Pin the extra in requirements/pyproject so deployment environments include it"],"exampleFix":"// before\npip install caveman-middleware\n// after\npip install 'caveman-middleware[pydantic-ai]'","handlingStrategy":"try-catch","validationCode":"import importlib.util\nif importlib.util.find_spec(\"pydantic_ai\") is None:\n    raise SystemExit(\"Install caveman-middleware[pydantic-ai]\")","typeGuard":null,"tryCatchPattern":"try:\n    from caveman_middleware import pydantic_ai\nexcept ImportError as e:\n    if \"pydantic-ai\" in str(e):\n        logging.error(\"Run: pip install 'caveman-middleware[pydantic-ai]'\")\n    raise","preventionTips":["Install with extras: pip install 'caveman-middleware[pydantic-ai]'","Declare the extra in pyproject/requirements for all environments","Keep dev and production dependency files in sync","Smoke-test imports in CI before deployment"],"tags":["python","import-error","optional-dependency","pydantic-ai"],"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"}