Token导航 LogoToken导航

Agent Skill · 研究检索

langgraph-execution-control(语言图执行控制)

langgraph-execution-control 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

langgraph-execution-control 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为需要联网;许可证信息还不明确,第三方扫描有提醒项,按安装量在研究检索类的 73,675 个 Skill 里排第 10,282。

总安装 12,831周安装 641GitHub Stars 638下载 5,436核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:langgraph-execution-control(语言图执行控制)
来源仓库:https://github.com/langchain-ai/langchain-skills
仓库路径:skills/langgraph-execution-control
安装命令:
npx skills add https://github.com/langchain-ai/langchain-skills --skill 'LangGraph Execution Control'
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/langchain-ai/langchain-skills --skill 'LangGraph Execution Control'

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

用于查找、检索和筛选相关信息,支持关键词和任务场景快速定位结果。适合在需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库和原始 README 核验具体用法。

安装命令:npx skills add https://github.com/langchain-ai/langchain-skills --skill 'LangGraph Execution Control'。安装前建议确认权限范围和维护状态,避免触发不必要操作。

来源仓库内路径:skills/langgraph-execution-control

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/langchain-ai/langchain-skills --skill 'LangGra…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

langgraph-execution-control 怎么安装?

在终端执行 npx skills add https://github.com/langchain-ai/langchain-skills --skill 'LangGraph Executi…。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

langgraph-execution-control 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

langgraph-execution-control 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

langgraph-execution-control 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

langgraph-execution-control 用的人多吗?

公开数据是累计安装 12,831 次,近一周安装 641 次,下载 5,436 次,GitHub 638 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

langgraph-execution-control 安全吗?

第三方扫描有提醒项,说明存在需要人工确认的行为。安装前请打开源码看清它读了什么、联网到哪里。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
langgraph-execution-control

语言图执行控制 · 本页

12,831638需要联网未明确有提醒

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

  1. Workflows vs Agents: Predetermined paths vs dynamic decision-making
  2. Send API: Fan-out to parallel workers (map-reduce)
  3. Interrupts: Pause for human input, resume with Command
  4. Streaming: Real-time state, tokens, and custom data
CharacteristicWorkflowAgent
Control FlowFixed, predeterminedDynamic, model-driven
PredictabilityHighLow
Use CaseSequential tasksOpen-ended problems

Workflows and Agents

class AgentState(TypedDict): messages: Annotated[list, operator.add]

model_with_tools = model.bind_tools([search])

def agent_node(state: AgentState) -> dict: return {"messages": [model_with_tools.invoke(state["messages"])]}

def tool_node(state: AgentState) -> dict: """Execute tool calls from the last AI message.""" result = [] for tc in state["messages"][-1].tool_calls: observation = tools_by_name[tc["name"]].invoke(tc["args"]) result.append(ToolMessage(content=observation, tool_call_id=tc["id"])) return {"messages": result}

def should_continue(state: AgentState): return "tools" if state["messages"][-1].tool_calls else END

agent = (StateGraph(AgentState).add_node("agent", agent_node).add_node("tools", tool_node).add_edge(START, "agent").add_conditional_edges("agent", should_continue).add_edge("tools", "agent") # Loop back after tool execution.compile())

</python>
<typescript>
ReAct agent pattern: model decides when to call tools, loop until done.

import { StateGraph, StateSchema, MessagesValue, START, END } from "@langchain/langgraph"; import { ToolMessage } from "@langchain/core/messages";

const State = new StateSchema({ messages: MessagesValue }); const modelWithTools = model.bindTools([searchTool]);

const agentNode = async (state: typeof State.State) => ({ messages: [await modelWithTools.invoke(state.messages)] });

const toolNode = async (state: typeof State.State) => ({ messages: await Promise.all( (state.messages.at(-1)?.tool_calls ?? []).map(async (tc) => new ToolMessage({ content: await searchTool.invoke(tc.args), tool_call_id: tc.id }) ) ) });

const shouldContinue = (state: typeof State.State) => state.messages.at(-1)?.tool_calls?.length ? "tools" : END;

const agent = new StateGraph(State) .addNode("agent", agentNode) .addNode("tools", toolNode) .addEdge(START, "agent") .addConditionalEdges("agent", shouldContinue) .addEdge("tools", "agent") .compile();


class OrchestratorState(TypedDict): tasks: list[str] results: Annotated[list, operator.add] summary: str

def orchestrator(state: OrchestratorState): """Fan out tasks to workers.""" return [Send("worker", {"task": task}) for task in state["tasks"]]

def worker(state: dict) -> dict: return {"results": [f"Completed: {state['task']}"]}

def synthesize(state: OrchestratorState) -> dict: return {"summary": f"Processed {len(state['results'])} tasks"}

graph = (StateGraph(OrchestratorState).add_node("worker", worker).add_node("synthesize", synthesize).add_conditional_edges(START, orchestrator, ["worker"]).add_edge("worker", "synthesize").add_edge("synthesize", END).compile())

result = graph.invoke({"tasks": ["Task A", "Task B", "Task C"]})

</python> <typescript> Fan out tasks to parallel workers using the Send API and aggregate results.

import { Send, StateGraph, StateSchema, ReducedValue, START, END } from "@langchain/langgraph";
import { z } from "zod";

const State = new StateSchema({
  tasks: z.array(z.string()),
  results: new ReducedValue(
    z.array(z.string()).default(() => []),
    { reducer: (curr, upd) => curr.concat(upd) }
  ),
  summary: z.string().default(""),
});

const orchestrator = (state: typeof State.State) => {
  return state.tasks.map((task) => new Send("worker", { task }));
};

const worker = async (state: { task: string }) => {
  return { results: [`Completed: ${state.task}`] };
};

const synthesize = async (state: typeof State.State) => {
  return { summary: `Processed ${state.results.length} tasks` };
};

const graph = new StateGraph(State)
  .addNode("worker", worker)
  .addNode("synthesize", synthesize)
  .addConditionalEdges(START, orchestrator, ["worker"])
  .addEdge("worker", "synthesize")
  .addEdge("synthesize", END)
  .compile();

Interrupts (Human-in-the-Loop)

TypeWhen SetUse Case
interrupt() (recommended)Inside node codeHuman-in-the-loop, conditional pausing. Resume with Command(resume=value)
interrupt_beforeAt compile timeDebugging only, not for HITL. Resume with invoke(None, config)
interrupt_afterAt compile timeDebugging only, not for HITL. Resume with invoke(None, config)

def review_node(state): if state["needs_review"]: user_response = interrupt({"action": "review", "data": state["draft"], "question": "Approve this draft?"}) if user_response == "reject": return {"status": "rejected"} return {"status": "approved"}

checkpointer = InMemorySaver()

graph = (StateGraph(State).add_node("review", review_node).add_edge(START, "review").add_edge("review", END).compile(checkpointer=checkpointer))

config = {"configurable": {"thread_id": "1"}} result = graph.invoke({"needs_review": True, "draft": "content"}, config)

Check for interrupt

if "interrupt" in result: print(result["interrupt"])

Resume with user decision

result = graph.invoke(Command(resume="approve"), config)

</python>
<typescript>
Pause execution for human review using dynamic interrupt and resume with Command.

import { interrupt, Command, MemorySaver, StateGraph, START, END } from "@langchain/langgraph";

const reviewNode = async (state: typeof State.State) => { if (state.needsReview) { const userResponse = interrupt({ action: "review", data: state.draft, question: "Approve this draft?" }); if (userResponse === "reject") { return { status: "rejected" }; } } return { status: "approved" }; };

const checkpointer = new MemorySaver();

const graph = new StateGraph(State) .addNode("review", reviewNode) .addEdge(START, "review") .addEdge("review", END) .compile({ checkpointer });

const config = { configurable: { thread_id: "1" } }; let result = await graph.invoke({ needsReview: true, draft: "content" }, config);

// Check for interrupt if (result.__interrupt__) { console.log(result.__interrupt__); }

// Resume with user decision result = await graph.invoke(new Command({ resume: "approve" }), config);


config = {"configurable": {"thread_id": "1"}} graph.invoke({"data": "test"}, config) # Runs until step2 graph.invoke(None, config) # Resume

</python> <typescript> Set compile-time breakpoints for debugging. Not recommended for human-in-the-loop — use interrupt() instead.

const graph = new StateGraph(State)
  .addNode("step1", step1)
  .addNode("step2", step2)
  .addEdge(START, "step1")
  .addEdge("step1", "step2")
  .addEdge("step2", END)
  .compile({
    checkpointer,
    interruptBefore: ["step2"],  // Pause before step2
  });

const config = { configurable: { thread_id: "1" } };
await graph.invoke({ data: "test" }, config);  // Runs until step2
await graph.invoke(null, config);  // Resume

Streaming

ModeWhat it StreamsUse Case
valuesFull state after each stepMonitor complete state
updatesState deltasTrack incremental updates
messagesLLM tokens + metadataChat UIs
customUser-defined dataProgress indicators

def my_node(state): writer = get_stream_writer() writer("Processing step 1...") # Do work writer("Complete!") return {"result": "done"}

for chunk in graph.stream({"data": "test"}, stream_mode="custom"): print(chunk)

</python>
<typescript>
Emit custom progress updates from within nodes using the stream writer.

import { getWriter } from "@langchain/langgraph";

const myNode = async (state: typeof State.State) => { const writer = getWriter(); writer("Processing step 1..."); // Do work writer("Complete!"); return { result: "done" }; };

for await (const chunk of graph.stream({ data: "test" }, { streamMode: "custom" })) { console.log(chunk); }


- Choose workflow vs agent pattern
- Use Send API for parallel execution
- Call `interrupt()` anywhere in nodes
- Set compile-time breakpoints
- Resume with `Command(resume=...)`
- Choose stream modes

### What You CANNOT Configure

- Interrupt without checkpointer
- Resume without thread_id
- Change Send API message-passing model

# CORRECT

class State(TypedDict): results: Annotated[list, operator.add] # Accumulates

</python> <typescript> Use ReducedValue to accumulate parallel worker results.

// WRONG: No reducer
const State = new StateSchema({ results: z.array(z.string()) });

// CORRECT
const State = new StateSchema({
  results: new ReducedValue(z.array(z.string()).default(() => []), { reducer: (curr, upd) => curr.concat(upd) }),
});

CORRECT

graph = builder.compile(checkpointer=InMemorySaver())

</python>
<typescript>
Checkpointer required for interrupt functionality.

// WRONG const graph = builder.compile();

// CORRECT const graph = builder.compile({ checkpointer: new MemorySaver() });


# CORRECT

graph.invoke(Command(resume="approve"), config)

</python> <typescript> Use Command to resume from an interrupt (regular object restarts graph).

// WRONG
await graph.invoke({ resumeData: "approve" }, config);

// CORRECT
await graph.invoke(new Command({ resume: "approve" }), config);

BETTER

def should_continue(state): if state["iterations"] > 10: return END if state["messages"][-1].tool_calls: return "tools" return END

</python>
<typescript>
Add max iterations check to prevent infinite loops.

// RISKY: Might loop forever const shouldContinue = (state) => state.messages.at(-1)?.tool_calls?.length ? "tools" : END;

// BETTER const shouldContinue = (state) => { if (state.iterations > 10) return END; return state.messages.at(-1)?.tool_calls?.length ? "tools" : END; };


# CORRECT

def node(state): response = model.invoke(state["messages"]) return {"messages": [response]}

</python> </fix-messages-mode-requires-llm>

<fix-custom-mode-needs-stream-writer> <python> Use get_stream_writer() to emit custom data.

# WRONG: print() isn't streamed
def node(state):
    print("Processing...")
    return {"data": "done"}

# CORRECT
def node(state):
    writer = get_stream_writer()
    writer("Processing...")  # Streamed!
    return {"data": "done"}

CORRECT

graph.stream({}, stream_mode=["updates", "messages"])

</python>
</fix-stream-modes-are-lists>

平台分布

Codex

32.29%
按下载量换算1,755

Claude

28.95%
按下载量换算1,574

Cursor

19.45%
按下载量换算1,057

Gemini CLI

10.33%
按下载量换算562

安全审计

Gen Agent Trust Hub

通过

Socket

可疑

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills