Langgraph State Management
soba-labs/langchain-agent-skills
Design state schemas, implement reducers, configure persistence, and debug state issues for LangGraph applications.
Tool skill for declaring reducers on LangGraph state keys so parallel writes merge instead of crashing.
$ npx skills add agentsope/SkillAlchemy --skill agentsop-state-reducer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install agentsope/SkillAlchemy agentsop-state-reducer --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/agentsope/SkillAlchemy.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/agentsop-state-reducer .claude/skills/agentsop-state-reducer && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "agentsop-state-reducer" agent skill from https://github.com/agentsope/SkillAlchemy/tree/master/skills/agentsop-state-reducer into .claude/skills/agentsop-state-reducer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentsop-state-reducer", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/agentsope/SkillAlchemy/tree/master/skills/agentsop-state-reducerType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add agentsope/SkillAlchemy --skill agentsop-state-reducer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install agentsope/SkillAlchemy agentsop-state-reducer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agentsope/SkillAlchemy.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/agentsop-state-reducer .agents/skills/agentsop-state-reducer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "agentsop-state-reducer" agent skill from https://github.com/agentsope/SkillAlchemy/tree/master/skills/agentsop-state-reducer into .agents/skills/agentsop-state-reducer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentsop-state-reducer", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add agentsope/SkillAlchemy --skill agentsop-state-reducer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install agentsope/SkillAlchemy agentsop-state-reducer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agentsope/SkillAlchemy.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/agentsop-state-reducer .cursor/skills/agentsop-state-reducer && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "agentsop-state-reducer" agent skill from https://github.com/agentsope/SkillAlchemy/tree/master/skills/agentsop-state-reducer into .cursor/skills/agentsop-state-reducer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentsop-state-reducer", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/agentsope/SkillAlchemy.git --path skills/agentsop-state-reducer--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add agentsope/SkillAlchemy --skill agentsop-state-reducer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install agentsope/SkillAlchemy agentsop-state-reducer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agentsope/SkillAlchemy.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/agentsop-state-reducer .gemini/skills/agentsop-state-reducer && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "agentsop-state-reducer" agent skill from https://github.com/agentsope/SkillAlchemy/tree/master/skills/agentsop-state-reducer into .gemini/skills/agentsop-state-reducer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentsop-state-reducer", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install agentsope/SkillAlchemy agentsop-state-reducerInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add agentsope/SkillAlchemy --skill agentsop-state-reducer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/agentsope/SkillAlchemy.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/agentsop-state-reducer .github/skills/agentsop-state-reducer && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "agentsop-state-reducer" agent skill from https://github.com/agentsope/SkillAlchemy/tree/master/skills/agentsop-state-reducer into .github/skills/agentsop-state-reducer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentsop-state-reducer", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add agentsope/SkillAlchemy --skill agentsop-state-reducer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install agentsope/SkillAlchemy agentsop-state-reducer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agentsope/SkillAlchemy.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/agentsop-state-reducer .opencode/skills/agentsop-state-reducer && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "agentsop-state-reducer" agent skill from https://github.com/agentsope/SkillAlchemy/tree/master/skills/agentsop-state-reducer into .opencode/skills/agentsop-state-reducer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentsop-state-reducer", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
agentsop-state-reducerTool skill for declaring reducers on LangGraph state keys so parallel writes merge instead of crashing.
Agentsop State Reducer is an agent skill from agentsope/SkillAlchemy. Tool skill for declaring reducers on LangGraph state keys so parallel writes merge instead of crashing. Activates whenever a coder agent designs a StateGraph with parallel branches, fan-out via Send, multi-agent topologies, or whenever a run raises InvalidUpdateError: At key '<k': Can receive only one value per step. Encodes the rule "every state key is single-writer or has a reducer — nothing in between."
Its SKILL.md is about 4.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Frontend & Design, covering State management and Building AI agents. It works with LangGraph. The repository describes itself as: From thought to skill. From signal to structure. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 6ea799f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are python).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Agentsop State Reducer loads about 4.5k tokens when it runs. Until then it costs about 109 tokens; SKILL.md has 2,140 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from agentsope/SkillAlchemy at commit 6ea799f, republished under its MIT licence (© agentsope). 2,140 words, ~4,499 tokens.
.claude/skills/agentsop-state-reducer/SKILL.md (or your agent's skills folder).Scope: a single decision — for each state key, declare a reducer or guarantee single-writer. Out of scope: checkpointers, HITL, supervisor vs. swarm — see
langgraph-sopfor those.
Activate when any trigger fires:
StateGraph, TypedDict/BaseModel schema,
or Annotated[..., <reducer>] typing.Send API,
multiple agents writing shared state, or a supervisor pattern where workers
return concurrently.langgraph.errors.InvalidUpdateError — message looks like
At key 'messages': Can receive only one value per step. Use an Annotated key to handle multiple values.Do not activate if every key is written by exactly one node per superstep (see §6: over-reducing single-writer keys is an anti-pattern).
LangGraph state is either single-writer or has a reducer. Nothing in between.
When a node returns {"k": v}, LangGraph must decide how to merge v into
existing state["k"]. There are exactly two legal regimes:
Annotated). At most one
node writes the key per superstep. The new value replaces the old.
Two concurrent writers → InvalidUpdateError.Annotated[T, reducer_fn]). Any number of writers may write per
superstep; LangGraph folds them via reducer_fn(current, new).The reducer is commutative-enough algebra that lets the engine schedule parallel writes without you reasoning about interleavings. Three canonical reducers cover ~90% of real graphs:
| Reducer | Type | Behaviour |
|---|---|---|
add_messages (from langgraph.graph.message) | list[BaseMessage] | Append; dedupe-and-update by message id (in-place edit when IDs match) |
operator.add | list, int, float, str | List concat / numeric sum |
Custom (curr, new) -> merged | anything | Domain-specific merge (keep-latest, dedupe-by-id, LLM-summarise) |
"Reducers are mandatory, not optional, for parallel execution." —
[cheatsheet/gotchas]
The add_messages quirk that beginners miss: it is not plain append. If
a new message shares an id with one in state, it overwrites in place. This
is what makes HITL interrupt() + edit-state work — a human can edit the
last AI turn and resume.
The decision is per-key, not per-schema. A schema can mix freely: one key
single-writer, another with add_messages, another with operator.add.
Run top-down for every new or modified state schema.
For each key k in the state schema, list every node that returns k in its
update dict. Be paranoid: include nodes spawned via Send, subgraphs whose
output schema overlaps the parent, and any conditional branches.
k: T.k: T will crash.Decision gate: if you cannot answer "which nodes write this key?" in one sentence per key, stop and redraw the graph before continuing.
Use the OP table in §4. Default ladder:
BaseMessage → add_messages.operator.add.operator.add.Before shipping, write a unit test that invokes the graph along the parallel
path with deterministic node outputs and asserts state matches expectation.
If the reducer is wrong (e.g., operator.add on dicts), this is where you
find out — not in production.
def test_parallel_merge():
out = graph.invoke({"items": []})
assert sorted(out["items"]) == ["a", "b"] # both workers' contributions presentIn a docstring on the TypedDict / Pydantic model, note for each non-default key why it has a reducer. Future maintainers will thank you when they refactor.
Each op: Trigger → Action → Output.
add_messages for a chat history keymessages: list[BaseMessage] field; ≥1 of (HITL
edit-state, multi-agent that all append turns, ReAct loop).from typing import Annotated, TypedDict
from langchain_core.messages import AnyMessage
from langgraph.graph.message import add_messages
class S(TypedDict):
messages: Annotated[list[AnyMessage], add_messages]operator.add for an accumulating listimport operator
from typing import Annotated, TypedDict
class S(TypedDict):
chunks: Annotated[list[str], operator.add]operator.add for a counterretries: Annotated[int, operator.add]. Each node returns the
delta ({"retries": 1}), not the new total.{"retries": state["retries"]+1})
with operator.add double-counts. Always return deltas under operator.add.current_task: str.summary field; you want
whichever was generated more recently to win.from datetime import datetime
Summary = dict # {"text": str, "ts": datetime}
def keep_latest(curr: Summary | None, new: Summary) -> Summary:
if curr is None or new["ts"] >= curr["ts"]:
return new
return curr
class S(TypedDict):
summary: Annotated[Summary, keep_latest]{"id": ..., ...}
documents and the union should be de-duplicated.def dedupe_by_id(curr: list[dict], new: list[dict]) -> list[dict]:
seen = {d["id"]: d for d in (curr or [])}
for d in new:
seen[d["id"]] = d # later wins on collision
return list(seen.values())
class S(TypedDict):
docs: Annotated[list[dict], dedupe_by_id]InvalidUpdateError post-mortemInvalidUpdateError: At key '<k>': Can receive only one value per step. Use an Annotated key to handle multiple values.<k> in the schema, identify the concurrent
writers, then pick OP-1/2/3/5/6 based on key semantics.messages — what reducer?"{"messages": [AIMessage(...)]} in the same superstep when the
supervisor fans out. Without a reducer → InvalidUpdateError. Naive
operator.add works but loses HITL edit-in-place semantics.operator.add — it concatenates blindly; retried messages with
the same id would appear twice and break the chat UI.add_messages — explicitly designed for this. Append by default,
overwrite in place when id matches [lc-docs/messages].ids in each agent (e.g., uuid4()) so dedupe is
deterministic. If an agent retries, reuse the previous attempt's id.add_messages
is almost always the right answer — operator.add is a code smell on
message lists.summary — append-merge-or-replace?"summary
string for the same document, in parallel. With no reducer → crash. With
operator.add on strings → concatenation glues them edge-to-edge ("A.B."
not "A. B."). Neither is semantically right.def collect(curr: list[str] | None, new: str) -> list[str]:
return (curr or []) + [new]
class S(TypedDict):
summary_drafts: Annotated[list[str], collect]
summary: str # single-writer, set by merge_nodemerge_node reads
state["summary_drafts"], runs one LLM call, writes
{"summary": "..."} (single-writer, no reducer needed).operator.add / a custom collector, then merge in a single-writer node
downstream. Reducers are for trivial folds; LLM merges belong in nodes.Send — do I still need a reducer?"[Send("worker", {"chunk": c}) for c in chunks].
Each worker writes {"results": [...]}. Schema is
results: list[dict] — does Send change reducer requirements?Send IS parallel writing. All workers complete in the same
superstep and merge back into parent state.Annotated[list[dict], operator.add] on results → crash on
the first run where >1 worker is spawned. (Schema looks fine in tests
with chunks=[c1] — fails in prod with chunks=[c1,c2].)results: Annotated[list[dict], operator.add].Send ≡ parallel writers, always. Any state key a
Send-target worker writes must have a reducer, even if the static graph
topology "looks" sequential.AP-1 · Ignoring the reducer until it crashes in prod. The schema looks
fine; tests pass with 1 worker; the first 2-chunk request in production
raises InvalidUpdateError. Fix: enumerate writers per key during
design (§3 Step 1), not after the page.
AP-2 · add_messages on non-message lists. It calls convert_to_messages
internally and will either raise or silently corrupt your data when items
aren't BaseMessage subclasses. Use operator.add or a custom reducer
for list[dict], list[str], list[Document].
AP-3 · Over-reducing single-writer keys. Declaring
Annotated[str, lambda a,b: b] "just in case" on a key only the supervisor
writes is noise — and worse, it hides future bugs by silently accepting
a second writer that should have raised. Leave single-writer keys
un-annotated; let the engine surface accidental concurrency.
AP-4 · Returning the new total under operator.add. With
retries: Annotated[int, operator.add], returning
{"retries": state["retries"] + 1} adds the new total to the old —
double-counting. Return the delta ({"retries": 1}).
AP-5 · Forgetting that Send is parallel. See Case 3. Any key written
by a Send-target is a parallel-write key.
AP-6 · Relying on reducer order. Reducers see writes in implementation-
defined order. add_messages and operator.add are order-insensitive for
the set of items but the resulting list order is not guaranteed across
runs. If you need a canonical order, sort downstream with an explicit key
(timestamp, branch index, etc.).
AP-7 · Stateful / non-pure reducers. Reducers must be pure functions
of (current, new). Reading external state (DB, time.now() inside the
reducer) breaks checkpoint replay and time-travel debugging. Push side
effects into nodes, never reducers.
AP-8 · Mutating curr in place inside a custom reducer. Return a new
value. Mutating the existing object can corrupt earlier checkpoints that
share the reference. Always construct and return a fresh container.
Hard boundary: reducers are a write-merge mechanism, not a read-consistency mechanism. If you need transactional read-modify-write across parallel nodes (e.g., "increment counter only if branch A succeeded"), that's a routing problem — sequence the nodes, don't smuggle it into a reducer.
The reducer pattern is not LangGraph's invention — it's a re-application of two well-known patterns. Recognizing the lineage helps onboard fast.
| Framework | Analog | Same idea | Different |
|---|---|---|---|
| LangGraph | Annotated[T, reducer] | Pure (curr, new) -> merged fold over parallel writes per superstep | Per-key declaration; runs inside a checkpointable state machine |
| Redux / Elm | reducer(state, action) -> state | Pure fold over an action stream, single source of truth | Single root reducer over a stream; LangGraph has per-key reducers over a superstep set |
| CRDTs (Conflict-Free Replicated Data Types) | G-Counter, OR-Set, LWW-Register | Commutative+associative merge of concurrent writes from distributed replicas | CRDTs assume eventually-consistent replicas; LangGraph reducers run inside one process at superstep boundaries — no network partitions, but the algebra rhymes |
| Pregel / BSP | message combiners between supersteps | Merge multiple incoming messages per vertex per superstep | LangGraph's direct ancestor — add_messages is literally a combiner |
| CrewAI | none (no shared typed state) | — | Task outputs flow sequentially via context; no parallel write merge to declare. That's why CrewAI is simpler — and why it can't express what LangGraph reducers express. |
| AutoGen | conversation log | Append-only message history | Single ordered log, not a typed multi-key state — no need for per-key reducers, but no parallel-write-on-typed-fields either |
The Redux insight that transfers cleanly: reducers must be pure, and that purity is what enables replay/time-travel. LangGraph's checkpoint replay relies on exactly this. If you've internalised Redux discipline, the LangGraph reducer rules are the same rules with a graph-shaped scope.
The CRDT insight that transfers cleanly: commutative merge frees you from
reasoning about order. operator.add on lists isn't strictly commutative
([a]+[b] != [b]+[a] as lists), but you should treat it as if it were and
sort downstream when order matters. Designing reducers to be
order-insensitive is the cheapest way to keep parallel graphs sane.
[cheatsheet/gotchas] = sumanmichael.github.io/langgraph-cheatsheet/cheatsheet/faqs-gotchas/
— "Reducers are mandatory, not optional, for parallel execution."[lc-docs/messages] = docs.langchain.com/oss/python/langgraph/ — add_messages "If a message with the same ID already exists, it updates that message in place rather than duplicating it."[aipractitioner/scaling] = aipractitioner.substack.com/p/scaling-langgraph-agents-parallelization
— parallel branch failure semantics.langgraph-sop for the full LangGraph SOP (state schema
design, checkpointers, HITL, multi-agent topologies). This skill is the
zoom-in on reducers only.© agentsope, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/agentsop-state-reducer of agentsope/SkillAlchemy.
Open the folder on GitHubat commit 6ea799f
Agentsop State Reducer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Agentsop State Reducer this skillagentsope/SkillAlchemy | 459 | — | ~4.5k | Automated safety check: Pass | MIT | |
| Langgraph State Managementsoba-labs/langchain-agent-skills | 107 | — | ~3.4k | Automated safety check: Pass | MIT | |
| Langgraphdavila7/claude-code-templates | 32k | 6 repos | ~1.9k | Automated safety check: Pass | MIT | |
| Langgraphmagnus919/agent-skills | 113 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Langgraphsickn33/agentic-awesome-skills | 47k | 2 repos | ~639 | Automated safety check: Pass | MIT | |
| Langchain Langgraph Basicsjeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~3.4k | Automated safety check: Pass | MIT |
soba-labs/langchain-agent-skills
Design state schemas, implement reducers, configure persistence, and debug state issues for LangGraph applications.
davila7/claude-code-templates
Expert in LangGraph - the production-grade framework for building stateful, multi-actor AI applications.
magnus919/agent-skills
Build multi-agent AI systems with LangGraph — the low-level orchestration framework for stateful, graph-based agent workflows.
sickn33/agentic-awesome-skills
Expert in LangGraph - the production-grade framework for building stateful, multi-actor AI applications.
jeremylongshore/tons-of-skills-marketplace
Build a correct LangGraph 1.0 StateGraph — typed TypedDict state with reducers, nodes, edges, compile, and recursion budgets — without hitting the silent-termination and state-replacement traps.
yonatangross/orchestkit
LangGraph 1.x (LTS) Python workflow patterns for state management, delta channels, resilience (node timeouts, error handlers, graceful drain), routing, parallel execution, supervisor-worker, tool…
agentsope/SkillAlchemy
SOP for terminal-based, git-native AI pair programming with Aider (git work-tree + tree-sitter repo-map + edit-format + human-in-loop REPL).
agentsope/SkillAlchemy
Coder-agent working-file budget discipline: keep the editable working set (files you /add into writable context) under ~25k tokens, separate "read" from "edit", delegate breadth to a read-only…
agentsope/SkillAlchemy
Split a multi-call LM workflow by cognitive load, not by accuracy: let one strong model make the few reasoning decisions and a cheap model do the many mechanical executions (Aider architect+editor…
agentsope/SkillAlchemy
SOP for building multi-agent systems with CrewAI — role-based collaboration, sequential/hierarchical processes, Flows, memory, delegation.
agentsope/SkillAlchemy
SOP for building LLM applications on Dify — visual workflow + chatflow + agent + RAG knowledge base + plugin marketplace + observability, self-hostable.
agentsope/SkillAlchemy
Designs multiscale chunking for RAG by embedding small units for retrieval precision and returning larger context for synthesis.
Works with
Categories
Tool skill for declaring reducers on LangGraph state keys so parallel writes merge instead of crashing. Agentsop State Reducer is an agent skill from agentsope/SkillAlchemy. Tool skill for declaring reducers on LangGraph state keys so parallel writes merge instead of crashing.
Agentsop State Reducer fits situations like: tasks that involve State management; tasks that involve Building AI agents.
Run `npx skills add agentsope/SkillAlchemy --skill agentsop-state-reducer -a claude-code`. Or copy the skill folder (skills/agentsop-state-reducer in agentsope/SkillAlchemy) into .claude/skills/agentsop-state-reducer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add agentsope/SkillAlchemy --skill agentsop-state-reducer -a codex`. Or copy the skill folder (skills/agentsop-state-reducer in agentsope/SkillAlchemy) into .agents/skills/agentsop-state-reducer in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add agentsope/SkillAlchemy --skill agentsop-state-reducer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/agentsop-state-reducer, .gemini/skills/agentsop-state-reducer, .github/skills/agentsop-state-reducer and .opencode/skills/agentsop-state-reducer in your project.
SKILL.md names no scripts, command-line tools or credentials: Agentsop State Reducer is instructions for the agent only. Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Agentsop State Reducer is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.5k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Agentsop State Reducer: Langgraph State Management (soba-labs/langchain-agent-skills, 107 stars), Langgraph (davila7/claude-code-templates, 32k stars), Langgraph (magnus919/agent-skills, 113 stars) and Langgraph (sickn33/agentic-awesome-skills, 47k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
agentsope (a GitHub user) maintains it in agentsope/SkillAlchemy, which has 459 GitHub stars. The repository holds 45 skills in this directory. The repository was last updated on September 2, 2026.
Source: agentsope/SkillAlchemy on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.