diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4d45614..04f18e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,9 @@ jobs: fail-fast: false matrix: python-version: ["3.11", "3.12"] + defaults: + run: + working-directory: ./py steps: - uses: actions/checkout@v4 diff --git a/.python-version b/.python-version deleted file mode 100644 index e4fba21..0000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.12 diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 8e029ca..8d705ee 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -17,8 +17,9 @@ build: create_environment: - uv venv "${READTHEDOCS_VIRTUALENV_PATH}" install: + - cd py - UV_PROJECT_ENVIRONMENT="${READTHEDOCS_VIRTUALENV_PATH}" uv sync --frozen --group docs # Build documentation with Mkdocs mkdocs: - configuration: mkdocs.yml + configuration: py/mkdocs.yml diff --git a/README.md b/README.md index d3c709f..981571d 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ LangDiff is a Python library that solves the hard problems of streaming structured LLM outputs to frontends. -![Diagram](./docs/diagram.png) +![Diagram](/docs/diagram.png) LangDiff provides intelligent partial parsing with granular, type-safe events as JSON structures build token by token, plus automatic JSON Patch generation for efficient frontend synchronization. Build responsive AI applications where your backend structures and frontend experiences can evolve independently. Read more about it on the [Motivation](#motivation) section. @@ -112,7 +112,7 @@ Suppose you want to generate a multi-section article with an LLM. Rather than wa you can stream the article progressively by first generating section titles as they're determined, then streaming each section's content as it's written. -![Demo Video](./docs/demo.gif) +![Demo Video](/docs/demo.gif) Start by defining model classes that specify your streaming structure: @@ -265,8 +265,8 @@ LangDiff enables you to build responsive, maintainable AI applications where the ## License -Apache-2.0. See the [LICENSE](./LICENSE) file for details. +Apache-2.0. See the [LICENSE](/LICENSE) file for details. ## Demo -See [`example.py`](./example.py) for a runnable end-to-end demo using streaming parsing and diff tracking. +See [`py/example.py`](/py/example.py) for a runnable end-to-end demo using streaming parsing and diff tracking. diff --git a/.gitignore b/py/.gitignore similarity index 100% rename from .gitignore rename to py/.gitignore diff --git a/py/README.md b/py/README.md new file mode 120000 index 0000000..32d46ee --- /dev/null +++ b/py/README.md @@ -0,0 +1 @@ +../README.md \ No newline at end of file diff --git a/docs/api/overview.md b/py/docs/api/overview.md similarity index 100% rename from docs/api/overview.md rename to py/docs/api/overview.md diff --git a/docs/api/parser.md b/py/docs/api/parser.md similarity index 100% rename from docs/api/parser.md rename to py/docs/api/parser.md diff --git a/docs/api/tracker.md b/py/docs/api/tracker.md similarity index 100% rename from docs/api/tracker.md rename to py/docs/api/tracker.md diff --git a/py/docs/diagram.png b/py/docs/diagram.png new file mode 100644 index 0000000..b16cab9 Binary files /dev/null and b/py/docs/diagram.png differ diff --git a/docs/index.md b/py/docs/index.md similarity index 100% rename from docs/index.md rename to py/docs/index.md diff --git a/example.py b/py/example.py similarity index 100% rename from example.py rename to py/example.py diff --git a/mkdocs.yml b/py/mkdocs.yml similarity index 100% rename from mkdocs.yml rename to py/mkdocs.yml diff --git a/pyproject.toml b/py/pyproject.toml similarity index 100% rename from pyproject.toml rename to py/pyproject.toml diff --git a/src/langdiff/__init__.py b/py/src/langdiff/__init__.py similarity index 100% rename from src/langdiff/__init__.py rename to py/src/langdiff/__init__.py diff --git a/src/langdiff/parser/__init__.py b/py/src/langdiff/parser/__init__.py similarity index 100% rename from src/langdiff/parser/__init__.py rename to py/src/langdiff/parser/__init__.py diff --git a/src/langdiff/parser/decoder.py b/py/src/langdiff/parser/decoder.py similarity index 100% rename from src/langdiff/parser/decoder.py rename to py/src/langdiff/parser/decoder.py diff --git a/src/langdiff/parser/model.py b/py/src/langdiff/parser/model.py similarity index 100% rename from src/langdiff/parser/model.py rename to py/src/langdiff/parser/model.py diff --git a/src/langdiff/parser/parser.py b/py/src/langdiff/parser/parser.py similarity index 100% rename from src/langdiff/parser/parser.py rename to py/src/langdiff/parser/parser.py diff --git a/src/langdiff/py.typed b/py/src/langdiff/py.typed similarity index 100% rename from src/langdiff/py.typed rename to py/src/langdiff/py.typed diff --git a/src/langdiff/tracker/__init__.py b/py/src/langdiff/tracker/__init__.py similarity index 100% rename from src/langdiff/tracker/__init__.py rename to py/src/langdiff/tracker/__init__.py diff --git a/src/langdiff/tracker/change_tracker.py b/py/src/langdiff/tracker/change_tracker.py similarity index 100% rename from src/langdiff/tracker/change_tracker.py rename to py/src/langdiff/tracker/change_tracker.py diff --git a/src/langdiff/tracker/changes.py b/py/src/langdiff/tracker/changes.py similarity index 100% rename from src/langdiff/tracker/changes.py rename to py/src/langdiff/tracker/changes.py diff --git a/src/langdiff/tracker/impl.py b/py/src/langdiff/tracker/impl.py similarity index 100% rename from src/langdiff/tracker/impl.py rename to py/src/langdiff/tracker/impl.py diff --git a/tests/test_change_tracker.py b/py/tests/test_change_tracker.py similarity index 100% rename from tests/test_change_tracker.py rename to py/tests/test_change_tracker.py diff --git a/tests/test_parser.py b/py/tests/test_parser.py similarity index 100% rename from tests/test_parser.py rename to py/tests/test_parser.py diff --git a/tests/test_partial_json.py b/py/tests/test_partial_json.py similarity index 100% rename from tests/test_partial_json.py rename to py/tests/test_partial_json.py diff --git a/uv.lock b/py/uv.lock similarity index 100% rename from uv.lock rename to py/uv.lock