gebruder/wirken

GitHub: gebruder/wirken

面向企业级安全部署的 AI 智能体多通道网关,通过进程隔离、加密凭据保险库和哈希链审计日志,在合规框架下安全地将消息平台接入多种 LLM 后端。

Stars: 106 | Forks: 2

# Wirken [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/38a2934e5a011331.svg)](https://github.com/gebruder/wirken/actions/workflows/ci.yml) ![Rust](https://img.shields.io/badge/rust-1.87%2B-orange.svg) [![Release](https://img.shields.io/github/v/release/gebruder/wirken)](https://github.com/gebruder/wirken/releases)

Wirken: the switchboard for the agent era

Wirken 是智能体时代的总机。通过 Telegram、Discord、Slack、Microsoft Teams、Matrix、WhatsApp、Signal、Google Chat 或 iMessage 向其发送消息,另一端的智能体将代表您读取文件、调用 API 和运行工具。每个通道都有自己独立的线路。每次调用在连接前都会被记录。 Wirken 以单个静态 Rust 二进制文件发布,并与 Ollama、Anthropic、OpenAI、Gemini、Bedrock、Tinfoil、Privatemode 或任何兼容 OpenAI 的端点配合使用。采用 MIT 许可证。 每个通道都在其独立的适配器进程中运行,具有独特的 Ed25519 IPC 身份及其自己的保险库范围的 token 集。凭据存储在由操作系统密钥链提供密钥的 XChaCha20-Poly1305 保险库中,并具有按凭据的过期时间和在存储中跟踪的手动轮换。每个智能体操作、工具调用、LLM 请求和响应都会写入到按会话的 SHA-256 哈希链审计日志中。在配置 SIEM 时,日志会转发到 Datadog、Splunk 或 Webhook。权限遵循按智能体范围划分的三层模型。产生子智能体的父智能体会声明每个子智能体的上限:工具允许列表、最大权限层级、最大轮次和最大运行时。 ## 安装与运行 下载最新发布的二进制文件: ``` curl -fsSL https://raw.githubusercontent.com/gebruder/wirken/main/install.sh | sh wirken setup wirken run ``` 在通过管道安装之前固定安装程序。已提交的 `install.sh` 具有以下 SHA-256: ``` 73e678196ea073608e902c8ab11a01ede07e0d37fddccaa20c43fa5d62bd52f5 ``` 自行验证: ``` curl -fsSL https://raw.githubusercontent.com/gebruder/wirken/main/install.sh | sha256sum ``` 然后安装程序会从发布版本中获取 `checksums.sha256` 和 `checksums.sha256.sig`,使用 `ssh-keygen -Y verify` 对脚本中嵌入的签名密钥验证签名,并根据签名的校验和验证二进制文件的 SHA-256。每个失败路径都是失败即关闭的:缺少签名、缺少校验和、摘要不匹配或没有 `sha256sum`/`shasum` 的机器都会中止安装。唯一的覆盖选项是 `WIRKEN_ALLOW_UNVERIFIED=1`,它会在标准错误输出中发出警告,并记录在 [docs/release-signing.md](docs/release-signing.md) 中。 预构建的二进制文件适用于 Linux (x86_64, aarch64) 和 macOS (x86_64, Apple Silicon)。Linux 二进制文件静态链接到 musl,不依赖 glibc。 或者从源代码构建(需要 Rust 1.85+ 和 `capnp` 编译器): ``` # Ubuntu/Debian sudo apt-get install -y capnproto # macOS brew install capnp cargo install --path crates/cli ``` `wirken setup` 将引导您完成三个步骤: ``` wirken setup ──────────── Step 1: Pick your AI Provider: Ollama (local) / Anthropic / OpenAI / Google Gemini / AWS Bedrock / Tinfoil / Privatemode / Custom endpoint API key: ******** Encrypting API key... API key encrypted and stored. Model: gpt-4.1-mini ← auto-detected from provider API Step 2: Pick your channels Add a channel: Telegram Telegram bot token: ******** telegram: token encrypted, adapter keypair generated, registered. Setup complete! Provider: openai (gpt-4o) Channels: telegram ``` `wirken run` 启动网关守护进程。它派生适配器进程,接受经过身份验证的连接,将消息路由到智能体,并在 `http://localhost:18790` 提供 WebChat UI: ``` wirken gateway v0.7.1 ────────────── Provider: ollama/llama3.2 Ollama version: 0.19.0 Route: telegram -> agent:default Socket: ~/.wirken/sockets/gateway.sock WebChat: http://localhost:18790 Gateway running. Press Ctrl+C to stop. ``` 所有本地服务都绑定到 127.0.0.1。Wirken 绝不会指示您将推理服务器、WebChat 或任何本地端点绑定到 0.0.0.0。 安装为系统服务,以便网关在登录时启动: ``` wirken setup --install-service ``` ## 架构 ``` graph TD Channels["Telegram · Discord · Slack · Teams · Matrix · WhatsApp · Signal · Google Chat · iMessage"] Channels -- "UDS · Ed25519 · Cap'n Proto" --> Registry subgraph Gateway["Wirken"] Registry[Adapter Registry] --> Router Router --> Detect[Injection Detection] Detect --> Factory[AgentFactory] Factory --> Agent[Agent Runtime] Agent --> Context[Context Engine] Agent --> Permissions Agent --> Skills Agent --> Tools Agent --> Vault --> Keychain subgraph Execution Tools --> Sandbox[Docker / gVisor / Wasm] end SessionLog["Session Log\n(per-session hash chain, attested)"] end Agent -- "UDS" --> McpProxy["MCP Proxy\n(separate process)"] McpProxy -- "stdio · HTTP · OAuth2" --> McpServers[MCP Servers] Agent -- HTTPS --> LLM[LLM Providers] Agent -- "spawn_subagent" --> Factory Detect -.-> SessionLog Permissions -.-> SessionLog Tools -.-> SessionLog SessionLog -.-> SIEM[SIEM / Webhook] ``` 每个通道适配器作为单独的操作系统进程运行。适配器通过 Unix 域套接字使用按适配器的 Ed25519 挑战-响应握手向网关进行身份验证。消息使用 Cap'n Proto(零拷贝,遍历受限)进行序列化。适配器只能为其自己的通道传递入站消息,并请求为其自己的通道发送出站消息。它不能调用工具、读取其他通道的会话或访问其他通道的凭据。 通道隔离在两个层面上运作。活跃的机制是进程级别的:每个通道在其自己的操作系统进程中运行,具有独特的 ed25519 身份。IPC crate 还定义了一个密封的 `Channel` 特征和 `SessionHandle` 类型,使跨通道句柄转换成为编译时错误。这种类型级别的 API 尚未贯穿到生产消息路径中,在该路径中,通道鉴别器是 Cap'n Proto 入站帧上的一个字符串字段。如果适配器进程受损,爆炸半径仅限于一个通道,因为网关的 IPC 边界(运行在独立的内存安全进程中)阻止了横向移动。 MCP 代理也通过 Unix 域套接字在进程外运行,且保险库句柄在代理中被隔离。MCP 服务器通过 stdio、HTTP 或 OAuth2 连接,并且智能体进程永远看不到 MCP 凭据。 智能体在轮次之间是无状态的。`AgentFactory` 通过重放其会话日志,为每个入站消息唤醒一个智能体。对话以类型化会话事件(用户消息、助手消息、工具调用、工具结果、LLM 请求/响应元数据)的形式,记录在按会话的只追加哈希链表中。如果智能体在轮次中途崩溃,线束会在唤醒时检测到不完整的工具轮次,并将它们作为失败浮出水面,而不是静默地重新执行副作用。上下文引擎在每次 LLM 调用之前,会根据每个模型的 token 预算修剪对话,优先丢弃旧的工具结果,然后再触及用户或助手文本。 智能体可以通过 `spawn_subagent` 将有界限的子任务委托给子智能体。操作员配置每个子项的能力上限(工具允许列表、最大权限层级、最大轮次、最大运行时)。子代以无头模式运行,没有交互式批准,隔离的会话日志,并且硬深度上限为 4。 ## 安全属性 - **会话证明。** 按智能体的 Ed25519 身份在每一轮后对按会话的哈希链进行签名。`wirken session verify` 离线重放日志并重新检查消息哈希、确定性工具结果和链完整性。被篡改的会话会破坏链条。 - **可重现的重放。** 每次 LLM 调用都作为类型化会话事件记录,带有发送的准确消息和工具的 SHA-256 哈希。验证器从日志中重新计算这些哈希,并标记任何差异。 - **按通道的进程隔离。** 每个通道适配器在其自己的操作系统进程中运行,具有独特的 ed25519 身份。类型级别的通道分离(`SessionHandle` 与 `SessionHandle`)存在于 IPC crate 中并经过了回归测试,但尚未用于生产消息路径。 - **进程外凭据隔离。** MCP 凭据(bearer token、OAuth2 客户端密钥)存在于单独的代理进程中。智能体进程永远看不到它们。保险库为 XChaCha20-Poly1305,由操作系统密钥链提供密钥;`secrecy` + `zeroize` 使得记录秘密成为编译时错误。 - **能力衰减的多智能体。** LLM 无法扩大子智能体的权限。操作员设定上限;线束进行交集、钳制和执行。子代以无头模式运行,没有交互式批准。 完整的 OWASP 和 NIST AI RMF 映射:[docs/security-properties.md](docs/security-properties.md) ## 企业部署 Wirken 为组织提供了所需的控制能力,以部署 AI 智能体而无需绕过现有的安全性、合规性和审计要求。 - **完整归因。** 每个入站消息都会记录平台发送者 ID、通道、会话和智能体。权限决策按智能体划分范围,而不是按用户。类型化会话事件记录了运行了什么操作、何时运行以及在哪个目标上运行。 - **防篡改审计追踪。** 所有操作在执行前作为类型化会话事件记录。按会话的 SHA-256 哈希链可检测修改或删除。按智能体的 Ed25519 证明在每一轮之后对链头进行签名。`wirken session verify` 离线重放日志并重新检查哈希。SIEM 转发实时将事件发送到 Datadog、Splunk 或任何 Webhook。 - **崩溃恢复。** 智能体在轮次之间是无状态的。线束在唤醒时重放会话日志。不完整的工具轮次会被检测到并作为失败浮出水面,而不是被静默地重新执行。 - **分级权限。** 三层模型。工作区文件访问和 Web 搜索始终被允许。Shell 执行和外部文件访问需要首次使用批准。破坏性操作、凭据访问和技能安装始终需要明确批准。批准在 30 天后过期。 - **能力衰减的多智能体。** 父智能体通过 `spawn_subagent` 在操作员配置的上限(工具允许列表、最大权限层级、最大轮次、最大运行时)下委托给子代。子代以无头模式运行,带有隔离的会话日志。硬深度上限为 4。 - **沙盒执行。** Shell 执行默认在临时 Docker 容器中运行(自 0.7.5 起为仅执行模式)。容器删除所有 Linux 能力,设置 `no-new-privileges`,使用 Docker 的默认 seccomp 配置文件,使用具有 64 MB tmpfs 在 `/tmp` 的只读根文件系统,限制内存和 PID,并以无网络的非 root 用户身份运行。gVisor (runsc) 是可选的,用于减少内核攻击面。如果在网关启动时无法访问 Docker,ToolRegistry 会记录明显的警告,并在智能体的生命周期内回退到主机执行;如果请求了 runsc 但未注册,警告会具体指出该依赖。沙盒配置是惰性的,因此在未使用时没有启动成本。 - **上下文管理。** 按模型的上下文引擎在每次 LLM 调用之前,在 token 预算下修剪对话,优先丢弃旧的工具结果,然后再触及用户或助手文本。结构化压缩事件被写入会话日志并投影回提示中,以便模型知道修剪了什么。 - **提示注入检测。** 入站消息会被扫描以查找角色切换尝试、指令覆盖、base64 编码的命令、工具调用注入和系统提示提取。检测到的威胁会在会话日志中被标记并转发到 SIEM;消息不会被阻止。 - **机密推理。** Tinfoil 和 Privatemode 提供商在硬件飞地(AMD SEV-SNP,Intel TDX)内运行 LLM。提示是端到端加密的,可抵御基础设施上的软件攻击。有关端到端信任模型和部署方案,请参阅 [Privatemode 参考实例](docs/reference/privatemode.md)。 - **加密凭据。** 从操作系统密钥链获取密钥的 XChaCha20-Poly1305 保险库。按凭据的过期和轮换。无明文导出。MCP 凭据隔离在单独的代理进程中。 - **集中策略。** `wirken setup --org https://wirken.corp.example.com` 从公司端点拉取提供商、SIEM、MCP 和权限配置。开发者可以开箱即用。IT 管理一个配置。策略在每次 `wirken run` 时刷新。 ## 文档 - [快速开始](docs/getting-started.md) - [团队部署](docs/deploying-for-teams.md)(共享推理、按通道适配器、当前限制) - [权限与身份](docs/permissions-and-identity.md)(当前已有的功能和计划中的功能) - [CLI 参考](docs/cli.md) - [配置参考](docs/configuration.md) - [通道设置](docs/channels.md)(Telegram、Discord、Slack、Teams、Matrix、Signal、Google Chat、iMessage) - [多智能体设置](docs/multi-agent.md) - [技能指南](docs/skills.md)(Markdown 技能、Wasm 技能、注册表) - [MCP 设置](docs/mcp.md) - [安全属性](docs/security-properties.md)(OWASP 和 NIST AI RMF 映射) - [企业部署](docs/enterprise.md)(组织配置、SIEM、沙盒) - [从 OpenClaw 迁移](docs/migration.md) - [故障排除](docs/troubleshooting.md) - [架构](docs/architecture.md) - [执行模型](docs/enforcement-model.md)(编译时与运行时保证) - [发布流程](docs/release-process.md)(版本号更新、标签、签名、发布、冒烟测试) - [发布签名](docs/release-signing.md)(Ed25519 密钥、轮换、验证) ## 状态 Wirken 0.7.x 是当前系列。0.7 获得修复和功能;0.6 仅获得安全修复。 - `crates/adapter-*` 下的 **9 个通道适配器**:Telegram、Discord、Slack、Microsoft Teams、Matrix、WhatsApp、Signal、Google Chat、iMessage。 - `crates/agent/srcllm.rs` 中的 **8 个 LLM 提供商**:Ollama、Anthropic、OpenAI、Google Gemini、AWS Bedrock、Tinfoil、Privatemode,以及用于任何兼容 OpenAI 的端点的 `custom` 提供商。 - `skills/` 下的 **15 个捆绑技能**。 - 工作区中的 **452 个测试**,在主分支上全部变绿(`cargo test --workspace`)。 - **签名发布。** `checksums.sha256` 使用 Ed25519 SSH 密钥离线签名。`install.sh` 内嵌公钥,从发布版本中获取 `checksums.sha256.sig`,并在任何验证失败时失败即关闭。请参阅 [docs/release-signing.md](docs/release-signing.md) 和 [KEYS](KEYS)。 ## 名称 Wirken:德语,意为*工作*、*编织*、*生效*。以 [Gebruder Ottenheimer](https://gebruder.ottenheimer.app/briefs/wirken.html) 命名,这是 1862 年至 1937 年间位于符腾堡的一家织造厂。 ## 许可证 MIT
标签:AI网关, Anthropic, CIS基准, Datadog, Discord, Ed25519, Gemini, JSONLines, LLM网关, LLM评估, Microsoft Teams, MIT协议, Ollama, OpenAI, Rust, SHA-256, Signal, Slack, Streamlit, StruQ, Telegram机器人, WhatsApp, XChaCha20-Poly1305, 人工智能, 代理调度, 保险库, 内存规避, 凭据管理, 加密, 单文件二进制, 即时通讯, 可视化界面, 哈希链, 多模态接入, 子域名变形, 安全, 审计日志, 开源, 权限管理, 构建工具, 模型越狱, 消息总线, 漏洞扫描器, 用户模式Hook绕过, 网络流量审计, 访问控制, 请求拦截, 超时处理, 进程隔离, 通知系统, 隐私计算, 零信任, 零日漏洞检测