Current collected state Current
Observed since 20 Oct, 23:29 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
agentstate-lib
Stateful coordination layer for multi-agent AI systems
AgentStateLib is a Python library for building reliable multi-agent workflows. It gives multiple agents a shared, typed state and a simple graph router, so you can coordinate them without passing raw strings around.
pip install agentstate-lib
import asyncio
from agentstatelib import SharedState, AgentGraph, StatePatch
graph = AgentGraph()
@graph.node("planner", context=["goal"])
async def planner(context: dict) -> StatePatch:
goal = context["goal"]
return StatePatch(
agent_id="planner",
target="facts.planned",
value=True,
reason=f"planned goal: {goal!r}",
)
@graph.node("summarizer", context=["facts.planned", "goal"])
async def summarizer(context: dict) -> StatePatch:
planned = context.get("facts", {}).get("planned")
goal = context.get("goal")
summary = f"Workflow for goal {goal!r} planned={planned}"
return StatePatch(
agent_id="summarizer",
target="facts.summary",
value=summary,
reason="add summary",
)
graph.edge(
"planner",
"summarizer",
condition=lambda s: s.get("facts", {}).get("planned") is True,
)
async def main() -> None:
state = SharedState(goal="Write a multi-agent blog post")
final_state = await graph.run(state, start="planner")
print(final_state.facts)
if __name__ == "__main__":
asyncio.run(main())
facts.planned = True”.StatePatch.["goal", "facts.planned"]), and only sees that subset of the state.Version 0.5.1 — all Phase 2E features are implemented and tested (93 tests pass, mypy strict: 0 errors).
Phase 1–2E implemented:
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
aiosqliteEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | aiosqlite>=0.19 | runtime |
pydanticEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pydantic>=2.0 | runtime |
fastapiEnvironment{
"extras": "",
"marker": "extra == \"api\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | fastapi>=0.100; extra == "api" | runtime |
uvicornEnvironment{
"extras": "standard",
"marker": "extra == \"api\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | uvicorn[standard]>=0.20; extra == "api" | runtime |
richEnvironment{
"extras": "",
"marker": "extra == \"dashboard\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | rich>=13.0; extra == "dashboard" | runtime |
httpxEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | httpx>=0.24; extra == "dev" | runtime |
hypothesisEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | hypothesis>=6.0; extra == "dev" | runtime |
mypyEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | mypy>=1.0; extra == "dev" | runtime |
pytest-asyncioEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pytest-asyncio>=0.21; extra == "dev" | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | pytest>=7.0; extra == "dev" | runtime |
ruffEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | ruff>=0.1; extra == "dev" | runtime |
mikeEnvironment{
"extras": "",
"marker": "extra == \"docs\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | mike>=2.2.0; extra == "docs" | runtime |
mkdocs-materialEnvironment{
"extras": "",
"marker": "extra == \"docs\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | mkdocs-material>=9.7.6; extra == "docs" | runtime |
mkdocstringsEnvironment{
"extras": "python",
"marker": "extra == \"docs\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | mkdocstrings[python]>=1.0.4; extra == "docs" | runtime |
opentelemetry-apiEnvironment{
"extras": "",
"marker": "extra == \"otel\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-api; extra == "otel" | runtime |
opentelemetry-exporter-otlp-proto-grpcEnvironment{
"extras": "",
"marker": "extra == \"otel\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-exporter-otlp-proto-grpc; extra == "otel" | runtime |
opentelemetry-sdkEnvironment{
"extras": "",
"marker": "extra == \"otel\"",
"requires_python": ">=3.11",
"evaluation": "NOT_EVALUATED"
} | opentelemetry-sdk; extra == "otel" | runtime |
bdist_wheel · 55.61 KB · Python py3
sdist · 181.49 KB · Python source
Observed since 20 Oct, 23:29 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:d147302e46a05bda3f6bd71035bc9d5ed75d5b07e9b61691bf79f7c67a583ec5