跳转至

Pulsing Forge — Agent 执行环境

读者:想集成 coding agent 的开发者、框架作者、技术决策者 版本快照:2026-05 · 32 工具开箱 callable(Hybrid + MCP runtime) 代码入口pip install pulsingfrom pulsing.forge import ForgeEnvironment


一句话

Pulsing Forge 是给 AI Agent 用的「工作环境运行时」——在指定 workspace 里安全地跑 shell、改文件、读图像、维护计划、连接 MCP,而不必在每个项目里重新拼 subprocess、sandbox、工具 schema 和审批流。

Forge 不是某个 CLI 的换皮,也 不是完整 Agent 产品。它是一层可嵌入的库:Host 管 LLM 与 UI,Forge 管环境 + 工具执行


为什么需要 Forge

几乎每个 coding agent 项目都会重复造同一套轮子:

重复劳动 典型痛点
Shell / Read / patch 每家参数名不同,错误处理各自为政
沙箱 策略散落,dev 与 prod 行为不一致
Plan / 弹窗 / token 预算 与工具层强耦合,难以换 UI
插件与 MCP handler 有了,runtime 没接上,装完 server 调不动
本地调试 vs 隔离执行 两套代码路径,行为漂移

Forge 把这些收敛成 一套工具面 + 一个 Environment 抽象,Host 只需实现 ToolSession(产品侧回调),其余交给运行时。


设计哲学

1. 环境优先,而非对话优先

Forge 回答的问题是:「给定 tool name + JSON args,在 workspace 里怎么安全执行?」

它不管理对话历史、不选模型、不做登录——这些属于 Host。这种切分让 Forge 可以嵌入 LangChain、自研 loop、Craft、企业审批流,而不绑定某一种 LLM 产品形态。

2. Host 与 Forge 职责分离

┌──────────────────────────────────────────┐
│  Host(你的产品)                          │
│  LLM loop · TUI/Web · 审批 UI · 记忆产品   │
│  实现 ToolSession:plan / 用户输入 / token │
└────────────────────┬─────────────────────┘
                     │ call_tool(name, args)
┌────────────────────▼─────────────────────┐
│  Forge                                    │
│  沙箱 · execpolicy · patch · MCP · 插件   │
│  返回 ToolResult { content, is_error }    │
└──────────────────────────────────────────┘

Forge 发出结构化请求(「请批准这条命令」「请回答这个问题」);Host 决定如何展示、阻塞或自动批准。Forge 内置 UI 是非目标。

3. 一套工具面,多种部署形态

同一组 32 个工具名与参数,可在三种模式下运行:

模式 API 适用
进程内 ForgeEnvironment.runtime() 单进程 Agent、单元测试、快速原型
Rust 高性能路径 HybridForgeRuntime(默认) maturin 构建后的生产默认
Actor 隔离 ToolWorkerActor 子进程 / 集群 worker,与 Pulsing gossip 共享

Host 换部署方式时,LLM 侧 tool schema 不必改

4. Rust 核心 + Python 生态

执行热路径(shell、patch、文件、审批门、MCP client)在 Rust crate pulsing-forge 中实现;Python 提供 Actor 绑定、Code Mode、Extension 与 fallback。默认 Hybrid dispatch:Rust 优先,暂无 Rust handler 的工具自动走 Python——保证 32 工具开箱 callable

5. 可验证的质量,而非口号

Forge 在 CI 中持续验证工具注册、默认可调用性与核心集成场景(test_hybrid_forge_callable.pytest_pulsing_forge.py 等)。对外说明能力边界时以测试结果为准,缺口诚实公开。


Forge 是什么 / 不是什么

✅ Forge 是 ❌ Forge 不是
Agent 工具与环境运行时(库) 完整 Agent OS 或 Chat 产品
可沙箱化的 workspace 执行层 容器编排(K8s 层由部署解决)
主流 coding agent 工具面 + Claude 互操作 helper 某单一 CLI / TUI 的复刻
MCP runtime + 插件安装骨架 MCP 目录 UI 或 OAuth 登录产品
与 Pulsing Actor 可选集成 强依赖分布式集群才能用

架构一览

Host 创建 ForgeEnvironment(cwd, sandbox_policy, session)
  HybridForgeRuntime          ← maturin 构建后默认
    ├─ Rust ForgeRuntime      ← 22 handler + MCP runtime
    └─ Python LocalToolRuntime ← 10 个 Host-only 工具 fallback
  Handlers(按域)
    Execution · Filesystem · Session · Discovery · MCP · Code Mode · Extension
  ToolResult → Host(或 Craft.on_forge_event 事件流)

三个核心类型(详见 abstractions.md):

  • ForgeEnvironment — 工作区根目录、沙箱策略、会话钩子
  • ToolSession — Host 实现的产品能力(plan、用户输入、审批)
  • ToolResult — 统一返回 { content, is_error, structured? }

工具能力全景(32 个)

Forge 注册 32 个标准工具,覆盖主流 coding agent 主路径:

隔离执行(11)— 适合 Actor worker

在沙箱进程里跑,不污染 Host 状态:

Read · Glob · Grep · Edit · Write · Bash · shell_command · exec_command · write_stdin · apply_patch · view_image

Host 协作(21)— 需要 UI 或全局状态

工具
Session update_plan · new_context · get_context_remaining · request_user_input · request_permissions
Discovery / 插件 tool_search · list_available_plugins_to_install · request_plugin_install
MCP list_mcp_resources · list_mcp_resource_templates · read_mcp_resource
Code Mode exec · wait
Extension web.run · skills.list · skills.read · memories.*(4)· web_search

另:Forge 额外提供 Read/Glob/…/Bash(Claude 互操作 alias),与 Session 域工具互补。

完整参数见 包内 README


开箱即用:Hybrid + MCP

2026-05 现状(对外可宣传的能力):

  1. maturin develop / 正式 wheel 安装后ForgeEnvironment().runtime() 默认走 HybridForgeRuntime
  2. 32 工具均可调用,不会出现 Unknown tool(CI:test_hybrid_forge_callable.py
  3. MCP runtime 默认启动list_mcp_resources 等 wired;无配置 server 时返回空列表,而非 runtime 未初始化
  4. Craft 已接入:Host 路径 Hybrid、插件安装后 refresh_mcp()、隔离 worker 同套工具面
from pulsing.forge import ForgeEnvironment

env = ForgeEnvironment.ephemeral(cwd="/path/to/repo")  # 本地 dev 默认 auto_approve
rt = env.runtime()

rt.call_tool("shell_command", {
    "command": "pytest -q",
    "workdir": "/path/to/repo",
    "timeout_ms": 60_000,
})
rt.call_tool("list_mcp_resources", {})
rt.call_tool("memories.list", {})

成熟度与边界

当前(2026-05)

维度 状态
32 工具 callable ✅ Hybrid dispatch + Python fallback
MCP runtime ✅ wired;无 server 时返回空列表
Actor 隔离 worker ToolWorkerActor + ForgeBackend
Code Mode L2 🟡 控制面 Actor 已接,后台续跑推进中
MCP 动态进 LLM 🟡 Hub + sync 已接,产品侧持续完善
pytest tests/python/test_hybrid_forge_callable.py tests/python/test_pulsing_forge.py -q

已知边界(发版说明级)

已就绪 仍在推进
32 工具 callable、Hybrid dispatch Code Mode 后台 cell、yield 续跑
MCP runtime live、refresh API 动态 MCP 工具自动进 LLM schema
execpolicy + 审批门(Rust) 更完整的 policy 与 sandbox 集成
memories Extension 本地 L2 web.run / skills authority、hosted search
Pulsing Actor 隔离 worker Craft 与 Forge 集成测试持续加强

适用场景

适合用 Forge

  • 你在做 coding agent / dev agent,需要稳定的 shell + 文件 + patch 工具层
  • 你想 标准 coding agent 工具面,又不想绑定某一家的 Chat 产品壳
  • 你需要 同一套工具 在本地进程与隔离 worker 之间切换
  • 你用 Pulsing 做分布式 Agent,需要 gossip 共享的 tool worker
  • 你在评估 Craft 或想参考其 Multi-Agent 架构(Craft 是 Forge 的参考 Host)

可能不需要 Forge

  • 只要简单 subprocess.run 一两个命令(直接写即可)
  • 需要完整开箱 Chat 产品(看 Craft 或自建 Host + Forge)
  • 只要 MCP server 开发、不要 agent 工具层(Forge 范围过大)

5 分钟上手

安装

pip install pulsing
# 从源码开发(Rust 路径 + Hybrid 默认):
maturin develop   # 或 uv run maturin develop

最小示例

from pulsing.forge import ForgeEnvironment, LocalToolSession

env = ForgeEnvironment(
    cwd=".",
    session=LocalToolSession(token_budget=128_000),
)
rt = env.runtime()

# 读文件
print(rt.call_tool("Read", {"file_path": "README.md"}))

# 跑测试
print(rt.call_tool("shell_command", {
    "command": "pytest tests/python/test_pulsing_forge.py -q",
    "workdir": ".",
    "timeout_ms": 120_000,
}))

接入自研 Agent loop

# 伪代码:把 Forge 当 tool backend
FORGE_TOOLS = env.runtime().tool_names()  # 32 个

async def on_llm_tool_call(name: str, arguments: dict):
    result = env.runtime().call_tool(name, arguments)
    return result.content

接入 Pulsing 隔离 worker

import pulsing as pul
from pulsing.forge import ToolWorkerActor, ToolWorkerConfig

await pul.init()
worker = await ToolWorkerActor.spawn(config=ToolWorkerConfig(cwd="."))
out = await worker.Read(file_path="README.md")
await pul.shutdown()

与 Pulsing 生态的关系

Pulsing          分布式 Actor 运行时(集群、gossip、隔离 spawn)
Pulsing Forge    Agent 工具与环境(import: pulsing.forge)  ← 本文
Craft            Multi-Agent 参考应用(pulsing.craft,Forge 的参考 Host)
  • 只用 ForgeForgeEnvironment + runtime(),无需启动集群
  • Forge + PulsingToolWorkerActor 隔离执行,事件经 tell_forge_event 回 Host
  • Forge + Craft:开箱 Multi-Agent、审批 UI、LLM schema(Craft 侧 schema 仍在补全)

Forge 可独立嵌入;Pulsing 与 Craft 是「把 Forge 跑满」的推荐路径,不是硬性依赖。


与其他方案的比较

维度 自研 subprocess LangChain Tools 闭源 Agent CLI Pulsing Forge
工具面统一 ❌ 各自实现 框架绑定 产品内封闭 ✅ 32 工具标准面
沙箱 / execpolicy 自行维护 通常无 通常成熟 🟡 Rust 门控 + 持续完善
MCP 自行接 视集成而定 视产品而定 ✅ runtime wired
与 Host 解耦 部分 ❌ 产品绑定 ✅ ToolSession 边界
隔离 / 集群执行 自行造 通常无 单机为主 ✅ Actor worker
开源可嵌入

Forge 的定位:开源、可嵌入、基于 Pulsing Actor 的 agent 执行层——介于「自己拼 shell」与「绑定完整闭源产品」之间。


路线图(高层)

  1. MCP 动态注册 — 插件安装 → server 拉起 → 工具进 LLM catalog
  2. Code Mode L2 — 后台 cell、yield 续跑(Python / Actor 控制面)
  3. Rust handler 覆盖 — execpolicy、unified_exec、Extension 深化
  4. Forge × Pulsing — 事件 Queue、多节点 worker(见 Pulsing 集成

文档导航

文档 适合谁
本文 对外介绍、选型、推广
快速开始 安装与首个 call_tool
核心概念 Host / Forge 心智模型
抽象模型 Environment、Session、工具域
工具清单(32) 按域划分的工具表
Pulsing 部署 ForgeBackend、Actor 拓扑
Pulsing 集成 ask/tell、能力矩阵
包内 README API 速查
Craft 一体化 架构 Review
工程说明 crate 与实现细节

许可与致谢

Apache-2.0。Rust 核心 crate:pulsing-forge。部分实现参考了业界开源 agent-tool 实践;第三方声明见 crates/pulsing-forge/NOTICE

Try it:

pip install pulsing && python -c "
from pulsing.forge import ForgeEnvironment
print(ForgeEnvironment.ephemeral().runtime().call_tool('Glob', {'pattern': '*.md', 'path': '.'}))
"

有问题或集成需求,欢迎从 快速开始 入手,或查阅 tests/python/test_hybrid_forge_callable.py 了解 32 工具 smoke 覆盖。