深入PenguinHarness架构:SDK、Server、CLI与Web接口边界设计完整解析
【免费下载链接】penguin-harness🐧 Unified and Stable RSI Platform项目地址: https://gitcode.com/gh_mirrors/pe/penguin-harness
PenguinHarness 是一个开源、本地优先的多 Agent 应用开发平台,它能自动化 AI 应用的构建、优化与部署。本文用一张分层图讲清楚它的架构核心:SDK(core)、Server、CLI、Web 四个接口各司其职的边界设计——哪一层负责跑 Agent、哪一层负责鉴权与持久化、哪一层只负责呈现。
一张图看懂四层分工
PenguinHarness 的 Monorepo 里,四个packages目录正好对应四个接口层,依赖关系是严格单向的:
| 接口层 | 包名 | 一句话定位 | 源码入口 |
|---|---|---|---|
| SDK | @prismshadow/penguin-core | Agent / Session 运行时 + OmniMessage 协议 | packages/core/src/index.ts |
| Server | @prismshadow/penguin-server | 多用户鉴权、SSE 流式会话、用量计费 | packages/server/src/ |
| CLI | @prismshadow/penguin-cli | penguin命令行,Agent 可脚本化驱动 | packages/cli/src/commands/ |
| Web | @prismshadow/penguin-web | 浏览器里的完整控制台 | packages/web/ |
上图即 SDK 能力的缩影:一句话让 PenguinHarness 构建出带检索、引用来源的完整 RAG 应用,全程仅花费约 $0.02 的 token 成本。
边界设计的第一原则:只有 SDK 层知道"如何跑一个 Agent";Server、CLI、Web 全部是 SDK 的调用方,谁也不重写一份 Agent 逻辑。
SDK 层:Agent、Session 与三接口契约
penguin-core是整个平台的"唯一事实来源",导出三块核心内容(见 packages/core/src/index.ts):
- OmniMessage 协议——统一的跨层消息格式,一次定义,SDK/Server/Web 通用;
- 三份接口契约——Human / LLM / Environment,分别定义"输入谁"、"问哪个模型"、"在哪个环境执行",见 packages/core/src/interfaces/;
- 运行时入口——
createAgent、Session、ContextEngine,见 packages/core/src/agent.ts。
最简用法只有一小段:
const agent = await createAgent({ agentId: "default_agent" }); const session = await agent.createSession({ workspaceDir: process.cwd() }); for await (const output of session.run([userText("创建 hello.txt")], { approve: async () => "allow", // 每次工具调用可单独审批 })) { /* 处理流式输出 */ }设计要点:模型引用永远是 (provider, model_id) 二元组,会话在"上下文打开"那一刻从磁盘组装模型上下文(assembleContext),压缩/切换模型都会打开一个全新的上下文——这让 SDK 天然可嵌入任何宿主程序(桌面 App、CI 脚本、另一个 Agent)。完整文档见 packages/docs/content/quickstart-sdk.zh.md 与 packages/docs/content/interfaces.zh.md。
Server 层:唯一碰数据的进程
penguin-server基于 Hono 构建,职责被严格圈定为三件事:
- 多用户鉴权与授权:内置
admin账号 + 首登链接机制,见 packages/server/src/auth/; - 会话执行与 SSE 流式推送:所有会话的 Token 流、工具输出经 SSE 实时下发;
- 用量计费与观测:成本中心、Trace 轨迹文件的落盘与导出。
关键约束是Server 是数据根目录~/.penguin/data的独占使用者:内置文件锁(packages/server/src/lock.ts)保证同一数据根只有一个 Server 进程运行。所以桌面 App 启动时发现 CLI 已起了服务,就直接"附着"过去而不是再起一个。
Trace 观测面就是这套设计的直接产出——每一轮工具调用、思考耗时、Token 成本都在执行时间线上可视化:
Server 落盘的 Trace 文件在 Web 端展开为"轨迹观测":全局统计 + 分轮次执行时间线。
API 全貌见 packages/docs/content/server-api.zh.md。
CLI 层:给 Agent 用的脚本化入口
penguin命令是 SDK 与 Server 的"双重消费者":一部分命令直接调 SDK(如penguin run一次性任务),一部分通过 HTTP 调用已运行的 Server(如penguin server-status、penguin server-stop,见 packages/cli/src/client.ts)。
常用命令速查:
| 命令 | 用途 |
|---|---|
penguin run -m "任务" | 一次性跑完一个任务就退出 |
penguin chat | 交互式 REPL(支持 /compact、/clear) |
penguin server | 以无头模式启动服务(与 Web 同一套 API) |
penguin config model add | 添加/配置模型凭据 |
penguin schedule/penguin cost | 定时任务 / 成本查询 |
命令实现分散在 packages/cli/src/commands/ 下的 18 个模块中。这种"SDK 直连 + Server 代理"的双通道设计,让 CLI 既能离线单机跑,也能管理远端服务——对"用 Agent 驱动 Agent"的场景尤为友好。文档见 packages/docs/content/cli.zh.md。
Web 与桌面:同一前端,不同外壳
Web 前端(packages/web/)只与 Server 的 HTTP/SSE 接口通信,从不直接触碰文件系统或 SDK——这是它可以在浏览器里安全运行的前提。桌面 App(packages/desktop/)则更进一步:内嵌 Server + 内嵌 Web 前端,双击即开、免登录、免终端,且与 CLI 共享同一个~/.penguin/data数据根,两种安装方式可无缝混用。
Web 控制台:左侧多会话列表 + 智能体/技能库/模型库/成本中心/评估中心五大导航,右侧流式对话与工具执行折叠卡。
为什么这样切边界:三条设计原则
- 单向依赖,SDK 是唯一事实来源——Agent 循环、压缩、上下文组装只在
penguin-core写一遍,四个接口层零重复。 - 数据独占,Server 是单点写入者——所有状态文件经原子写(packages/core/src/internal/atomic-write.ts)落盘,避免多进程互相踩坏数据。
- 表现层无状态——Web 桌面只是 Server 的"投影",随时可关、可换,升级前端不影响会话数据。
快速选型:我该用哪个接口?
| 你的场景 | 推荐接口 |
|---|---|
| 日常聊天、管理 Agent 与模型 | 🖥️ 桌面 App 或 Web |
| 服务器上无头跑批、接入 CI | ⌨️penguin server+ API |
| 在自己程序里嵌入 Agent 能力 | 📦@prismshadow/penguin-coreSDK |
| 让另一个 Agent 自动化操作本工具 | ⌨️ CLI(penguin run等) |
总结:PenguinHarness 的架构精髓不在功能堆料,而在克制——SDK 管"怎么想",Server 管"怎么存",CLI 管"怎么驱动",Web 管"怎么看"。四层边界清晰后,无论嵌入宿主程序、无头部署还是多用户访问,走的都是同一条经过打磨的 Agent 内核。想动手深入,建议从 packages/docs/content/architecture.zh.md 与 README.md 开始。
【免费下载链接】penguin-harness🐧 Unified and Stable RSI Platform项目地址: https://gitcode.com/gh_mirrors/pe/penguin-harness
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考