{"record":{"id":"1a647104010e08fd","repo":"jax-ml/jax","slug":"abstractmesh-does-not-implement-name","errorCode":null,"errorMessage":"AbstractMesh does not implement {name}","messagePattern":"AbstractMesh does not implement (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/_src/mesh.py","lineNumber":579,"sourceCode":"  @property\n  def local_devices(self):\n    _raise_value_error(\"local_devices\")\n\n  @property\n  def local_mesh(self):\n    _raise_value_error(\"local_mesh\")\n\n  def __enter__(self):\n    _raise_value_error(\"__enter__\")\n\n  def __exit__(self, exc_type, exc_value, traceback):\n    _raise_value_error(\"__exit__\")\n\n\n# Create this indirection because pytype fails to recognize a property if a\n# property raises an exception unconditionally. Remove this once that is fixed.\ndef _raise_value_error(name):\n  raise ValueError(f\"AbstractMesh does not implement {name}\")\n\nempty_abstract_mesh = AbstractMesh((), ())\nempty_concrete_mesh = Mesh(np.empty((), dtype=object), ())\n\nclass use_abstract_mesh:\n  \"\"\"Sets a abstract mesh in a thread-local context.\n\n  ``jax.sharding.use_abstract_mesh`` can be used as a context manager.\n\n  For example::\n\n    abstract_device = jax.sharding.AbstractDevice(\n        device_kind='TPU v6 lite', num_cores=1, platform='tpu')\n    abstract_mesh = jax.sharding.AbstractMesh((2,), ('x',), (AxisType.Explicit,),\n                                               abstract_device=abstract_device)\n\n    @jax.jit\n    def f(x):","sourceCodeStart":561,"sourceCodeEnd":597,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/mesh.py#L561-L597","documentation":"AbstractMesh intentionally leaves most members (devices, local_devices, size, __enter__, etc.) unimplemented, raising ValueError through _raise_value_error. AbstractMesh exists only as a named placeholder for named-sharding computation before a concrete mesh exists; calling concrete-mesh APIs on it is a misuse.","triggerScenarios":"Accessing empty_abstract_mesh.devices, .device_ids, .is_multi_process, .local_devices, .local_mesh, or entering it as a context manager; getting an AbstractMesh from the config's abstract_mesh_context_manager and treating it like a Mesh.","commonSituations":"Code written against concrete Mesh being handed an abstract mesh from jax.config.abstract_mesh_context_manager (set via use_abstract_mesh); autosharding-mode pipelines where the ambient mesh is abstract; type checks that pass (Mesh-like) but attribute access then fails.","solutions":["Guard with isinstance(mesh, jax.sharding.Mesh) before using concrete-mesh attributes","Exit the use_abstract_mesh context before accessing device-level properties","When you need devices, require a concrete mesh (create Mesh(devices, names)) explicitly"],"exampleFix":"# before\nmesh = jax.config.abstract_mesh_context_manager.value\ndevs = mesh.devices  # may be AbstractMesh -> ValueError\n\n# after\nmesh = jax.config.abstract_mesh_context_manager.value\nif isinstance(mesh, jax.sharding.Mesh):\n  devs = mesh.devices\nelse:\n  devs = jax.devices()","handlingStrategy":"type-guard","validationCode":"import jax\nmesh = jax.config.abstract_mesh_context_manager.value\nusable = isinstance(mesh, jax.sharding.Mesh)","typeGuard":"import jax\ndef is_concrete_mesh(m) -> bool:\n    return isinstance(m, jax.sharding.Mesh)","tryCatchPattern":null,"preventionTips":["Never assume the ambient mesh is concrete in autosharding code","Branch on isinstance(mesh, jax.sharding.Mesh) before .devices access"],"tags":["jax","mesh","abstract-class","not-implemented"],"backgroundTag":"abstract-method-not-implemented","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}