Development#
Contributions are welcome: bug fixes, tests, documentation, and features that stay within the library’s scope (attention and transformer building blocks on JAX / Flax).
If you are unsure whether something fits, open an issue first.
How to contribute#
Use GitHub issues for bugs and design questions, and pull requests for code or doc changes. The usual workflow is: fork, branch, change, run the tests and doc build locally, open a PR.
What is expected of a PR:
New behavior comes with tests under
tests/.If the public API changes, the relevant docstrings and any affected pages in
docs/are updated in the same PR.
The project is distributed under the Apache License 2.0. There is no separate contributor agreement: if you open a PR that is merged, your contribution is included under the same license as the rest of the repository.
Local install#
From a clone of the repository:
cd attnax
pip install -e ".[test]"
That installs Attnax in editable mode plus pytest and optax (used
by the training tests and the getting-started notebook).
Tests#
python -m pytest tests/
Writing docstrings#
attnax uses Google-style docstrings rendered by sphinx.ext.napoleon.
Inline markup inside a docstring is reStructuredText, not Markdown
(page-level docs — getting_started.ipynb, this page, the README — are
the other way around: Markdown / MyST, never RST).
A typical docstring for a new public function or class:
def my_function(x: jnp.ndarray, ...) -> jnp.ndarray:
"""One-line description ending with a period.
Longer description if helpful, including mathematical context for
algorithms.
Args:
x: Description of ``x``.
...
Returns:
Description of the return value.
Raises:
ValueError: When the inputs do not satisfy ...
Example:
::
import jax.numpy as jnp
from attnax import my_function
y = my_function(jnp.ones((2, 4)))
"""
Existing classes such as
TransformerConfig
and
MultiHeadAttention
are good references when in doubt.
Doctests#
Code blocks inside Example: sections can be executed as doctests:
python -m doctest -v attnax/<module>.py
docs/conf.py configures doctest_global_setup so jax,
jax.numpy as jnp, flax.nnx as nnx, and attnax are already
imported in every doctest block — examples should reuse those names
rather than re-importing.
Building the documentation#
Install the docs extra (Sphinx, MyST-NB, the theme, etc.):
pip install -e ".[docs]"
cd docs
make html
Open docs/_build/html/index.html. The getting-started guide is a
notebook (getting_started.ipynb); the Sphinx build renders it without
re-executing cells (nb_execution_mode = "off" in conf.py).
Read the Docs uses docs/requirements.txt in addition to installing the
package; keep that file aligned with the [docs] dependencies in
pyproject.toml if you add doc-only packages.
Code style#
The codebase follows the
Google Python Style Guide.
ruff enforces the rules wired in pyproject.toml.
AI-generated contributions#
AI coding tools are fine to use; the bar for accepting a contribution is the same as for human-written code. In practice that means a contribution should not cost the reviewer more time than the contributor put into preparing it — read what you submit, run the tests, and check that the docstring template and code style match the rest of the package before opening the PR.