langgraph-events 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- langgraph_events-0.2.0/.github/workflows/ci.yml +34 -0
- langgraph_events-0.2.0/.github/workflows/docs.yml +35 -0
- langgraph_events-0.2.0/.github/workflows/publish.yml +46 -0
- langgraph_events-0.2.0/.gitignore +12 -0
- langgraph_events-0.2.0/.pdm-python +1 -0
- langgraph_events-0.2.0/.pre-commit-config.yaml +52 -0
- langgraph_events-0.2.0/.python-version +1 -0
- langgraph_events-0.2.0/CHANGELOG.md +48 -0
- langgraph_events-0.2.0/CLAUDE.md +24 -0
- langgraph_events-0.2.0/CONTRIBUTING.md +67 -0
- langgraph_events-0.2.0/LICENSE +21 -0
- langgraph_events-0.2.0/PKG-INFO +92 -0
- langgraph_events-0.2.0/README.md +66 -0
- langgraph_events-0.2.0/docs/agui.md +240 -0
- langgraph_events-0.2.0/docs/api.md +96 -0
- langgraph_events-0.2.0/docs/checkpointer-evolution.md +30 -0
- langgraph_events-0.2.0/docs/concepts.md +212 -0
- langgraph_events-0.2.0/docs/control-flow.md +108 -0
- langgraph_events-0.2.0/docs/getting-started.md +105 -0
- langgraph_events-0.2.0/docs/index.md +44 -0
- langgraph_events-0.2.0/docs/patterns.md +45 -0
- langgraph_events-0.2.0/docs/reducers.md +74 -0
- langgraph_events-0.2.0/docs/streaming.md +68 -0
- langgraph_events-0.2.0/examples/content_pipeline.graph.md +12 -0
- langgraph_events-0.2.0/examples/content_pipeline.py +179 -0
- langgraph_events-0.2.0/examples/human_in_the_loop.graph.md +16 -0
- langgraph_events-0.2.0/examples/human_in_the_loop.py +212 -0
- langgraph_events-0.2.0/examples/map_reduce.graph.md +12 -0
- langgraph_events-0.2.0/examples/map_reduce.py +172 -0
- langgraph_events-0.2.0/examples/react_agent.graph.md +13 -0
- langgraph_events-0.2.0/examples/react_agent.py +197 -0
- langgraph_events-0.2.0/examples/reflection_loop.graph.md +13 -0
- langgraph_events-0.2.0/examples/reflection_loop.py +165 -0
- langgraph_events-0.2.0/examples/supervisor.graph.md +20 -0
- langgraph_events-0.2.0/examples/supervisor.py +248 -0
- langgraph_events-0.2.0/mkdocs.yml +28 -0
- langgraph_events-0.2.0/pyproject.toml +139 -0
- langgraph_events-0.2.0/scripts/generate_mermaid.py +116 -0
- langgraph_events-0.2.0/scripts/release.py +249 -0
- langgraph_events-0.2.0/scripts/validate_tests.py +252 -0
- langgraph_events-0.2.0/src/langgraph_events/__init__.py +69 -0
- langgraph_events-0.2.0/src/langgraph_events/_custom_event.py +89 -0
- langgraph_events-0.2.0/src/langgraph_events/_event.py +266 -0
- langgraph_events-0.2.0/src/langgraph_events/_event_log.py +112 -0
- langgraph_events-0.2.0/src/langgraph_events/_graph.py +886 -0
- langgraph_events-0.2.0/src/langgraph_events/_handler.py +193 -0
- langgraph_events-0.2.0/src/langgraph_events/_internal.py +367 -0
- langgraph_events-0.2.0/src/langgraph_events/_reducer.py +244 -0
- langgraph_events-0.2.0/src/langgraph_events/_types.py +20 -0
- langgraph_events-0.2.0/src/langgraph_events/agui/__init__.py +35 -0
- langgraph_events-0.2.0/src/langgraph_events/agui/_adapter.py +541 -0
- langgraph_events-0.2.0/src/langgraph_events/agui/_context.py +68 -0
- langgraph_events-0.2.0/src/langgraph_events/agui/_mappers.py +179 -0
- langgraph_events-0.2.0/src/langgraph_events/agui/_protocols.py +87 -0
- langgraph_events-0.2.0/src/langgraph_events/agui/_transport.py +61 -0
- langgraph_events-0.2.0/src/langgraph_events/py.typed +0 -0
- langgraph_events-0.2.0/tests/conftest.py +53 -0
- langgraph_events-0.2.0/tests/test_agui.py +2547 -0
- langgraph_events-0.2.0/tests/test_event.py +237 -0
- langgraph_events-0.2.0/tests/test_event_graph.py +3559 -0
- langgraph_events-0.2.0/tests/test_event_log.py +272 -0
- langgraph_events-0.2.0/tests/test_mermaid_sync.py +19 -0
- langgraph_events-0.2.0/tests/test_on_decorator.py +324 -0
- langgraph_events-0.2.0/todos.md +11 -0
- langgraph_events-0.2.0/uv.lock +2192 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
lint:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
- uses: astral-sh/ruff-action@v3
|
|
14
|
+
with:
|
|
15
|
+
args: check src/ tests/
|
|
16
|
+
- uses: astral-sh/ruff-action@v3
|
|
17
|
+
with:
|
|
18
|
+
args: format --check src/ tests/
|
|
19
|
+
|
|
20
|
+
typecheck:
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
- uses: astral-sh/setup-uv@v5
|
|
25
|
+
- run: uv sync --group dev
|
|
26
|
+
- run: uv run mypy src/
|
|
27
|
+
|
|
28
|
+
test:
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@v4
|
|
32
|
+
- uses: astral-sh/setup-uv@v5
|
|
33
|
+
- run: uv sync --group dev
|
|
34
|
+
- run: uv run pytest tests/
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: Docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
pages: write
|
|
13
|
+
id-token: write
|
|
14
|
+
|
|
15
|
+
concurrency:
|
|
16
|
+
group: pages
|
|
17
|
+
cancel-in-progress: false
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
deploy:
|
|
21
|
+
environment:
|
|
22
|
+
name: github-pages
|
|
23
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@v4
|
|
27
|
+
- uses: astral-sh/setup-uv@v5
|
|
28
|
+
- run: uv sync --group docs --frozen
|
|
29
|
+
- run: uv run mkdocs build --strict
|
|
30
|
+
- uses: actions/configure-pages@v5
|
|
31
|
+
- uses: actions/upload-pages-artifact@v3
|
|
32
|
+
with:
|
|
33
|
+
path: site
|
|
34
|
+
- id: deployment
|
|
35
|
+
uses: actions/deploy-pages@v4
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
name: Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v[0-9]+.[0-9]+.[0-9]+*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build:
|
|
10
|
+
name: Build and validate
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- uses: astral-sh/setup-uv@v5
|
|
15
|
+
- run: uv sync --group dev
|
|
16
|
+
- name: Verify tag matches package version
|
|
17
|
+
run: |
|
|
18
|
+
TAG="${GITHUB_REF#refs/tags/v}"
|
|
19
|
+
PKG=$(grep '^version' pyproject.toml | head -1 | cut -d'"' -f2)
|
|
20
|
+
if [ "$TAG" != "$PKG" ]; then
|
|
21
|
+
echo "::error::Tag v$TAG does not match pyproject.toml version $PKG"
|
|
22
|
+
exit 1
|
|
23
|
+
fi
|
|
24
|
+
- run: uv run ruff check src/ tests/
|
|
25
|
+
- run: uv run mypy src/
|
|
26
|
+
- run: uv run pytest tests/
|
|
27
|
+
- run: uv build
|
|
28
|
+
- uses: actions/upload-artifact@v4
|
|
29
|
+
with:
|
|
30
|
+
name: dist
|
|
31
|
+
path: dist/
|
|
32
|
+
|
|
33
|
+
publish:
|
|
34
|
+
name: Publish to PyPI
|
|
35
|
+
needs: build
|
|
36
|
+
runs-on: ubuntu-latest
|
|
37
|
+
environment: pypi
|
|
38
|
+
permissions:
|
|
39
|
+
id-token: write
|
|
40
|
+
steps:
|
|
41
|
+
- uses: astral-sh/setup-uv@v5
|
|
42
|
+
- uses: actions/download-artifact@v4
|
|
43
|
+
with:
|
|
44
|
+
name: dist
|
|
45
|
+
path: dist/
|
|
46
|
+
- run: uv publish --trusted-publishing always
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/Users/paulsoares/Development/langgraph-events/.venv/bin/python
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
default_language_version:
|
|
2
|
+
python: python3.11
|
|
3
|
+
|
|
4
|
+
repos:
|
|
5
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
6
|
+
rev: v0.15.2
|
|
7
|
+
hooks:
|
|
8
|
+
- id: ruff
|
|
9
|
+
args: [--fix, --exit-non-zero-on-fix]
|
|
10
|
+
- id: ruff-format
|
|
11
|
+
|
|
12
|
+
- repo: local
|
|
13
|
+
hooks:
|
|
14
|
+
- id: validate-tests
|
|
15
|
+
name: validate tests
|
|
16
|
+
entry: bash -c "uv run python scripts/validate_tests.py"
|
|
17
|
+
language: system
|
|
18
|
+
pass_filenames: false
|
|
19
|
+
always_run: true
|
|
20
|
+
- id: mypy
|
|
21
|
+
name: mypy
|
|
22
|
+
language: system
|
|
23
|
+
entry: uv run mypy src/
|
|
24
|
+
types: [python]
|
|
25
|
+
pass_filenames: false
|
|
26
|
+
require_serial: true
|
|
27
|
+
|
|
28
|
+
- id: jscpd
|
|
29
|
+
name: jscpd
|
|
30
|
+
language: system
|
|
31
|
+
entry: npx jscpd src/ tests/ --min-tokens 30 --min-lines 2 --threshold 5
|
|
32
|
+
types: [python]
|
|
33
|
+
pass_filenames: false
|
|
34
|
+
require_serial: true
|
|
35
|
+
files: ^(src/|tests/)
|
|
36
|
+
|
|
37
|
+
- id: mermaid-graphs
|
|
38
|
+
name: mermaid-graphs
|
|
39
|
+
language: system
|
|
40
|
+
entry: uv run python scripts/generate_mermaid.py
|
|
41
|
+
pass_filenames: false
|
|
42
|
+
require_serial: true
|
|
43
|
+
files: ^examples/.*\.py$
|
|
44
|
+
|
|
45
|
+
- id: pytest
|
|
46
|
+
name: pytest
|
|
47
|
+
language: system
|
|
48
|
+
entry: bash -c 'uv run coverage run -m pytest && uv run coverage report'
|
|
49
|
+
types: [python]
|
|
50
|
+
pass_filenames: false
|
|
51
|
+
require_serial: true
|
|
52
|
+
files: ^(src/|tests/)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.11
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.2.0] - 2026-04-06
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Field-level dispatch for `@on` decorator
|
|
14
|
+
- AG-UI protocol adapter with `langgraph-events[agui]` optional dependency
|
|
15
|
+
- Custom event emit helpers (`emit_custom`, `aemit_custom`, `emit_state_snapshot`, `aemit_state_snapshot`)
|
|
16
|
+
- First-class `StateSnapshotFrame` for state snapshot streaming
|
|
17
|
+
- `SKIP` sentinel for scalar reducer no-op returns
|
|
18
|
+
- Graceful `Halted` subtypes (`MaxRoundsExceeded`, `Cancelled`) and `OrphanedEventWarning`
|
|
19
|
+
- LLM token streaming (`LLMToken`, `LLMStreamEnd` frames)
|
|
20
|
+
- MkDocs documentation site on GitHub Pages
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- Restructured docs for better DX (split concepts, grouped API reference)
|
|
24
|
+
- `Interrupted` is now a bare marker class — subclass with typed fields
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
- AG-UI adapter message deduplication and ID reconciliation
|
|
28
|
+
- `connect()` yielding no events for new threads
|
|
29
|
+
- Resume interrupt detection for interrupts created during resume
|
|
30
|
+
|
|
31
|
+
## [0.1.0] - 2026-02-20
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
- Core `Event`, `EventGraph`, and `@on` decorator
|
|
35
|
+
- `Reducer` and `ScalarReducer` for custom state channels
|
|
36
|
+
- `EventLog` with query methods (`first`, `count`, `after`, `before`, `select`)
|
|
37
|
+
- Multi-subscription `@on(A, B)` and `Scatter` for fan-out
|
|
38
|
+
- `Auditable` and `MessageEvent` base events
|
|
39
|
+
- `SystemPromptSet` event for system prompts
|
|
40
|
+
- Config and store injection for handlers
|
|
41
|
+
- `Interrupted` / `Resumed` events for human-in-the-loop
|
|
42
|
+
- Mermaid diagram generation
|
|
43
|
+
- BDD-style test suite with pytest-describe
|
|
44
|
+
- CI workflow (lint, typecheck, test)
|
|
45
|
+
|
|
46
|
+
[Unreleased]: https://github.com/cadance-io/langgraph-events/compare/v0.2.0...HEAD
|
|
47
|
+
[0.2.0]: https://github.com/cadance-io/langgraph-events/compare/v0.1.0...v0.2.0
|
|
48
|
+
[0.1.0]: https://github.com/cadance-io/langgraph-events/releases/tag/v0.1.0
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# langgraph-events
|
|
2
|
+
|
|
3
|
+
Event-driven abstraction for LangGraph. State IS events.
|
|
4
|
+
|
|
5
|
+
## Commands
|
|
6
|
+
|
|
7
|
+
- **Tests:** `uv run pytest tests/`
|
|
8
|
+
- **Lint:** `uv run ruff check src/ tests/`
|
|
9
|
+
- **Format:** `uv run ruff format src/ tests/`
|
|
10
|
+
- **Type check:** `uv run mypy src/`
|
|
11
|
+
|
|
12
|
+
## Structure
|
|
13
|
+
|
|
14
|
+
- `src/langgraph_events/` — library source
|
|
15
|
+
- `tests/` — BDD-style with pytest-describe (`describe_`/`when_`/`it_`)
|
|
16
|
+
- `examples/` — usage examples
|
|
17
|
+
|
|
18
|
+
## Conventions
|
|
19
|
+
|
|
20
|
+
- Python 3.10+, line length 88
|
|
21
|
+
- Use `uv` to run all tooling (not bare `python` or `pytest`)
|
|
22
|
+
- Ruff for linting and formatting (config in pyproject.toml)
|
|
23
|
+
- mypy strict mode
|
|
24
|
+
- Tests: `describe_` groups by API surface, `when_` mirrors code branches, `it_` names the assertion. Test each behavior once at the API boundary where it's consumed. Shared event classes in `conftest.py`; scenario-specific events inline. Event classes used as handler type annotations must be defined at module level (not inside `describe_`/`when_` blocks) so Python can resolve forward references at runtime.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
## Development
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
uv sync --group dev
|
|
7
|
+
uv run pytest tests/
|
|
8
|
+
uv run ruff check src/ tests/
|
|
9
|
+
uv run ruff format src/ tests/
|
|
10
|
+
uv run mypy src/
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Releasing
|
|
14
|
+
|
|
15
|
+
### One-time setup
|
|
16
|
+
|
|
17
|
+
Before the first release, the repo owner must:
|
|
18
|
+
|
|
19
|
+
1. **Register trusted publishers on PyPI** — go to [pypi.org/manage/account/publishing](https://pypi.org/manage/account/publishing/) and add a pending trusted publisher:
|
|
20
|
+
- Project name: `langgraph-events`
|
|
21
|
+
- Owner: `cadance-io`
|
|
22
|
+
- Repository: `langgraph-events`
|
|
23
|
+
- Workflow: `publish.yml`
|
|
24
|
+
- Environment: `pypi`
|
|
25
|
+
|
|
26
|
+
2. **Create GitHub environment** — go to repo Settings → Environments and create `pypi`
|
|
27
|
+
|
|
28
|
+
### Cutting a release
|
|
29
|
+
|
|
30
|
+
1. Make sure `CHANGELOG.md` has entries under `[Unreleased]`.
|
|
31
|
+
|
|
32
|
+
2. Run the release script:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Preview changes
|
|
36
|
+
uv run python scripts/release.py minor --dry-run
|
|
37
|
+
|
|
38
|
+
# Cut the release (bumps version, stamps changelog, commits, tags)
|
|
39
|
+
uv run python scripts/release.py minor
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The script accepts `major`, `minor`, `patch`, or an explicit version like `1.0.0`.
|
|
43
|
+
|
|
44
|
+
3. Push to trigger the publish workflow:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
git push origin main v0.3.0
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The workflow builds the package and publishes to PyPI.
|
|
51
|
+
|
|
52
|
+
### What the release script does
|
|
53
|
+
|
|
54
|
+
`scripts/release.py` automates:
|
|
55
|
+
|
|
56
|
+
- Bumps version in `pyproject.toml`, `README.md`, `docs/index.md`
|
|
57
|
+
- Stamps `[Unreleased]` in `CHANGELOG.md` with the new version and today's date
|
|
58
|
+
- Updates changelog footer comparison links
|
|
59
|
+
- Runs `uv lock` to sync `uv.lock`
|
|
60
|
+
- Commits with message `release: vX.Y.Z`
|
|
61
|
+
- Creates git tag `vX.Y.Z`
|
|
62
|
+
|
|
63
|
+
Preflight checks ensure you're on `main`, working tree is clean, `[Unreleased]` has content, and the tag doesn't already exist.
|
|
64
|
+
|
|
65
|
+
### Changelog
|
|
66
|
+
|
|
67
|
+
We use [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format. Add entries under `[Unreleased]` as you work — the release script moves them to the new version section automatically.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 cadance-io
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: langgraph-events
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Opinionated event-driven abstraction for LangGraph. State IS events.
|
|
5
|
+
Project-URL: Homepage, https://cadance-io.github.io/langgraph-events/
|
|
6
|
+
Project-URL: Repository, https://github.com/cadance-io/langgraph-events
|
|
7
|
+
Project-URL: Documentation, https://cadance-io.github.io/langgraph-events/
|
|
8
|
+
Project-URL: Changelog, https://github.com/cadance-io/langgraph-events/blob/main/CHANGELOG.md
|
|
9
|
+
Author: cadance-io
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: event-driven,events,langgraph,state-machine
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Typing :: Typed
|
|
21
|
+
Requires-Python: >=3.10
|
|
22
|
+
Requires-Dist: langgraph>=0.2.0
|
|
23
|
+
Provides-Extra: agui
|
|
24
|
+
Requires-Dist: ag-ui-protocol>=0.1.0; extra == 'agui'
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
|
|
27
|
+
# langgraph-events
|
|
28
|
+
|
|
29
|
+
Opinionated event-driven abstraction for LangGraph. **State IS events.**
|
|
30
|
+
|
|
31
|
+
> [!CAUTION]
|
|
32
|
+
> **Experimental (v0.2.0)** - This is an early-stage personal project, not a supported product. The API will change without notice or migration path.
|
|
33
|
+
|
|
34
|
+
## Quick Start
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
from langgraph_events import Event, EventGraph, on
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class MessageReceived(Event):
|
|
41
|
+
text: str
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class ReplyProduced(Event):
|
|
45
|
+
text: str
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@on(MessageReceived)
|
|
49
|
+
def reply(event: MessageReceived) -> ReplyProduced:
|
|
50
|
+
return ReplyProduced(text=f"Echo: {event.text}")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
graph = EventGraph([reply])
|
|
54
|
+
log = graph.invoke(MessageReceived(text="hello"))
|
|
55
|
+
print(log.latest(ReplyProduced))
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Installation
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pip install langgraph-events
|
|
62
|
+
|
|
63
|
+
# With AG-UI adapter support
|
|
64
|
+
pip install "langgraph-events[agui]"
|
|
65
|
+
|
|
66
|
+
# From source (development)
|
|
67
|
+
pip install git+https://github.com/cadance-io/langgraph-events.git
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Documentation
|
|
71
|
+
|
|
72
|
+
- Docs site (GitHub Pages): <https://cadance-io.github.io/langgraph-events/>
|
|
73
|
+
- Local docs index: [`docs/index.md`](docs/index.md)
|
|
74
|
+
- Getting started: [`docs/getting-started.md`](docs/getting-started.md)
|
|
75
|
+
- Core concepts: [`docs/concepts.md`](docs/concepts.md)
|
|
76
|
+
- Patterns: [`docs/patterns.md`](docs/patterns.md)
|
|
77
|
+
- API reference: [`docs/api.md`](docs/api.md)
|
|
78
|
+
- AG-UI adapter: [`docs/agui.md`](docs/agui.md)
|
|
79
|
+
- Checkpointer and graph evolution: [`docs/checkpointer-evolution.md`](docs/checkpointer-evolution.md)
|
|
80
|
+
|
|
81
|
+
## Development
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
uv sync --group dev
|
|
85
|
+
uv run pytest tests/
|
|
86
|
+
uv run ruff check src/ tests/
|
|
87
|
+
uv run mypy src/
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## License
|
|
91
|
+
|
|
92
|
+
MIT - see [`LICENSE`](LICENSE).
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# langgraph-events
|
|
2
|
+
|
|
3
|
+
Opinionated event-driven abstraction for LangGraph. **State IS events.**
|
|
4
|
+
|
|
5
|
+
> [!CAUTION]
|
|
6
|
+
> **Experimental (v0.2.0)** - This is an early-stage personal project, not a supported product. The API will change without notice or migration path.
|
|
7
|
+
|
|
8
|
+
## Quick Start
|
|
9
|
+
|
|
10
|
+
```python
|
|
11
|
+
from langgraph_events import Event, EventGraph, on
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class MessageReceived(Event):
|
|
15
|
+
text: str
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ReplyProduced(Event):
|
|
19
|
+
text: str
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@on(MessageReceived)
|
|
23
|
+
def reply(event: MessageReceived) -> ReplyProduced:
|
|
24
|
+
return ReplyProduced(text=f"Echo: {event.text}")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
graph = EventGraph([reply])
|
|
28
|
+
log = graph.invoke(MessageReceived(text="hello"))
|
|
29
|
+
print(log.latest(ReplyProduced))
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pip install langgraph-events
|
|
36
|
+
|
|
37
|
+
# With AG-UI adapter support
|
|
38
|
+
pip install "langgraph-events[agui]"
|
|
39
|
+
|
|
40
|
+
# From source (development)
|
|
41
|
+
pip install git+https://github.com/cadance-io/langgraph-events.git
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Documentation
|
|
45
|
+
|
|
46
|
+
- Docs site (GitHub Pages): <https://cadance-io.github.io/langgraph-events/>
|
|
47
|
+
- Local docs index: [`docs/index.md`](docs/index.md)
|
|
48
|
+
- Getting started: [`docs/getting-started.md`](docs/getting-started.md)
|
|
49
|
+
- Core concepts: [`docs/concepts.md`](docs/concepts.md)
|
|
50
|
+
- Patterns: [`docs/patterns.md`](docs/patterns.md)
|
|
51
|
+
- API reference: [`docs/api.md`](docs/api.md)
|
|
52
|
+
- AG-UI adapter: [`docs/agui.md`](docs/agui.md)
|
|
53
|
+
- Checkpointer and graph evolution: [`docs/checkpointer-evolution.md`](docs/checkpointer-evolution.md)
|
|
54
|
+
|
|
55
|
+
## Development
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
uv sync --group dev
|
|
59
|
+
uv run pytest tests/
|
|
60
|
+
uv run ruff check src/ tests/
|
|
61
|
+
uv run mypy src/
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## License
|
|
65
|
+
|
|
66
|
+
MIT - see [`LICENSE`](LICENSE).
|