Doramagic 项目包 · 项目说明书
tandem 项目
生成时间:2026-05-26 08:33:38 UTC
Tandem 概述
Tandem 是一个本地优先、零信任的 AI 工作空间运行时基础设施。它不仅仅是聊天界面或代理框架,而是 AI 代理在从回答问题到在企业系统中执行操作的过程中,所依赖的执行运行时。Tandem 将意图转化为受治理的工具执行,确保每一次操作都有审计追踪。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
资料来源:README.md:1-10
核心设计理念
Tandem 的核心理念是 Intent → Authority Projection → Scoped Execution → Approval Gates → Artifacts → Audit Trail。这个流程确保了 AI 操作的可控性和可追溯性。
Tandem 不是另一个聊天封装器,也不是简单的代理框架。它是代理在企业系统中移动时赖以运行的执行运行时。所有入口点(桌面应用、TUI、Web 控制面板、SDK)都连接到同一个引擎运行时,而运行时拥有运行、会话、内存、上下文、提供商密钥、MCP 工具、审批、工件和审计记录的权威性。
资料来源:README.md:47-60
架构概览
graph TB
subgraph "客户端层"
TUI["TUI 终端界面<br>tandem-tui"]
Desktop["桌面应用<br>Tauri App"]
Panel["Web 控制面板<br>Control Panel"]
SDK["SDK 客户端<br>TypeScript/Python"]
end
subgraph "引擎运行时"
Engine["tandem-engine<br>Headless HTTP/SSE 运行时"]
Sidecar["tandem-browser<br>浏览器自动化 Sidecar"]
end
subgraph "核心子系统"
Memory["Memory System<br>记忆系统"]
Tools["Tool Registry<br>工具注册表"]
MCP["MCP Connectors<br>MCP 连接器"]
Governance["Governance Engine<br>治理引擎"]
end
subgraph "提供商层"
Providers["Provider Registry<br>12+ 提供商支持"]
OpenAI["OpenAI"]
Anthropic["Anthropic"]
Ollama["Ollama"]
Others["Others..."]
end
TUI -->|HTTP/SSE| Engine
Desktop -->|Sidecar IPC| Engine
Panel -->|HTTP/SSE| Engine
SDK -->|HTTP API| Engine
Engine <--> Sidecar
Engine <--> Memory
Engine <--> Tools
Engine <--> MCP
Engine <--> Governance
Providers --> OpenAI
Providers --> Anthropic
Providers --> Ollama
Providers --> Others
Engine --> Providers组件职责
| 组件 | 类型 | 职责 | 源码位置 |
|---|---|---|---|
tandem-engine | Rust 二进制 | Headless HTTP/SSE 运行时,执行 AI 任务 | engine/src/main.rs |
tandem-browser | Sidecar 二进制 | 浏览器自动化能力 | src-tauri/src/sidecar.rs |
| Tauri Desktop | 桌面应用 | 本地桌面入口,带 Vault 加密存储 | src-tauri/src/lib.rs |
| @frumu/tandem-client | TypeScript SDK | HTTP API 客户端封装 | packages/tandem-client-ts/README.md |
支持的 AI 提供商
Tandem 采用提供商无关(Provider agnostic)的设计,支持 12 种以上的 AI 提供商:
graph LR
P["Provider Registry"] --> O["openai"]
P --> OR["openrouter"]
P --> A["anthropic"]
P --> OL["ollama"]
P --> G["groq"]
P --> M["mistral"]
P --> T["together"]
P --> AZ["azure"]
P --> B["bedrock"]
P --> V["vertex"]
P --> C["copilot"]
P --> CO["cohere"]| 提供商 ID | 说明 | 配置方式 |
|---|---|---|
openai | OpenAI GPT 系列 | API Key |
openrouter | OpenRouter 聚合 | API Key |
anthropic | Anthropic Claude 系列 | API Key |
ollama | 本地 Ollama | 端点配置 |
groq | Groq 加速推理 | API Key |
mistral | Mistral AI | API Key |
together | Together AI | API Key |
azure | Azure OpenAI | Azure 凭据 |
bedrock | AWS Bedrock | AWS 凭据 |
vertex | Google Vertex AI | GCP 凭据 |
copilot | GitHub Copilot | OAuth 认证 |
cohere | Cohere | API Key |
引擎 CLI 与命令
tandem-engine 是 Tandem 的核心命令行工具,提供多种运行模式:
# 启动 HTTP/SSE 运行时服务
tandem-engine serve --hostname 127.0.0.1 --port 39731
# 检查引擎健康状态
tandem-engine status --hostname 127.0.0.1 --port 39731
# 单次 prompt 执行
tandem-engine run "Summarize this repository" --provider openrouter --model openai/gpt-4o-mini
# 直接工具执行
tandem-engine tool --json @payload.json
# 从标准输入读取
cat payload.json | tandem-engine tool --json -
# 列出可用提供商
tandem-engine providers
# 生成 API Token
tandem-engine token generate
服务命令示例
| 命令 | 用途 | 环境变量 |
|---|---|---|
serve | 启动 HTTP/SSE 服务 | TANDEM_ENGINE_HOST, TANDEM_ENGINE_PORT |
status | 健康检查 | TANDEM_ENGINE_HOST, TANDEM_ENGINE_PORT |
run | 单次任务执行 | --provider, --model |
tool | 工具直接调用 | --json |
memory | 记忆导入导出 | --path, --format, --tier |
Sidecar 架构
Tandem 采用 Sidecar 模式管理浏览器自动化能力。桌面应用通过进程间通信与 tandem-browser sidecar 交互。
sequenceDiagram
participant Desktop as Tauri Desktop App
participant Engine as tandem-engine
participant Sidecar as tandem-browser
Desktop->>Engine: 启动服务
Engine->>Sidecar: 进程启动 (Child Process)
Desktop->>Engine: 请求浏览器操作
Engine->>Sidecar: 转发操作指令
Sidecar->>Sidecar: 执行浏览器自动化
Sidecar-->>Engine: 返回结果
Engine-->>Desktop: SSE 事件推送Sidecar 生命周期管理
Sidecar 管理器负责 sidecar 的版本追踪、下载和更新:
| 功能 | 说明 | 源码 |
|---|---|---|
| 版本检测 | 探测已安装 sidecar 版本 | src-tauri/src/sidecar.rs:45-60 |
| 版本更新 | 从 GitHub releases 检查更新 | src-tauri/src/sidecar_manager.rs:20-40 |
| 进程管理 | Windows Job Objects / Unix fork | src-tauri/src/sidecar.rs:25-40 |
| 健康检查 | 版本探针和状态报告 | crates/tandem-server/src/browser_parts/part02.rs |
资料来源:src-tauri/src/sidecar.rs:1-60
安全与隐私
Tandem 采用零信任安全模型,在多个层面保护用户数据和系统安全:
| 安全特性 | 实现方式 | 说明 |
|---|---|---|
| 遥测零追踪 | 无分析/追踪代码 | Tandem 不包含任何分析或回拨遥测 |
| 提供商流量隔离 | 仅发送至配置端点 | AI 请求内容只发送到用户配置的提供商 |
| 网络范围控制 | 桌面运行时仅通信本地 sidecar | 与 127.0.0.1 和配置的端点通信 |
| 凭据加密存储 | AES-256-GCM | 提供商密钥使用 AES-256-GCM 加密 |
| 文件系统安全 | 作用域访问 | 访问仅限于授权文件夹,敏感路径默认拒绝 |
Vault 状态管理
桌面应用中的 Vault 模块管理加密密钥的生命周期:
pub struct VaultState {
pub unlocked: RwLock<bool>, // Vault 是否解锁
pub master_key: RwLock<Option<Vec<u8>>>, // 解密的主密钥
pub app_data_dir: PathBuf, // 应用数据目录
}
资料来源:src-tauri/src/lib.rs:45-60
客户端 SDK
TypeScript / Node.js 客户端
@frumu/tandem-client 是 Tandem 的官方 TypeScript SDK,支持 Node 18+:
import { TandemClient } from "@frumu/tandem-client";
const client = new TandemClient({
baseUrl: "http://localhost:39731",
token: "your-engine-token",
});
// 1. 创建会话
const sessionId = await client.sessions.create({
title: "My agent session",
directory: "/path/to/my/project",
});
// 2. 异步启动运行
const { runId } = await client.sessions.promptAsync(
sessionId,
"Summarize the README"
);
// 3. 流式接收响应
for await (const event of client.stream(sessionId, runId)) {
if (event.type === "session.response") {
process.stdout.write(String(event.properties.delta ?? ""));
}
}
客户端配置选项
| 选项 | 类型 | 必需 | 默认值 | 说明 |
|---|---|---|---|---|
baseUrl | string | 是 | - | Tandem 引擎地址 |
token | string | 是 | - | 引擎 API Token |
timeoutMs | number | 否 | 20000 | 请求超时(毫秒) |
浏览器状态响应
SDK 提供了完整的类型定义来描述引擎状态:
interface BrowserStatusResponse {
enabled?: boolean;
runnable?: boolean;
headless_default?: boolean;
sidecar?: BrowserBinaryStatus;
browser?: BrowserBinaryStatus;
blocking_issues?: BrowserBlockingIssue[];
recommendations?: string[];
}
资料来源:packages/tandem-client-ts/src/wire/index.ts:1-80
部署模式
Tandem 支持多种部署模式,可根据需求选择:
graph TB
A["部署模式选择"] --> B["桌面应用"]
A --> C["Headless 引擎"]
A --> D["Web 控制面板"]
A --> E["自定义 SDK"]
B --> B1["Tauri 桌面客户端"]
B --> B2["内置 sidecar 管理"]
C --> C1["tandem-engine serve"]
C --> C2["无图形界面"]
C --> C3["远程/VPS 部署"]
D --> D1["@frumu/tandem-panel"]
D --> D2["完整 Web UI"]
E --> E1["TypeScript SDK"]
E --> E2["Python SDK"]
E --> E3["直接 HTTP API"]快速入门指南
| 场景 | 推荐方式 | 命令 |
|---|---|---|
| 桌面用户 | Tauri 应用 | 下载 tandem.ac |
| Web 控制面板 | npm 全局安装 | npm i -g @frumu/tandem && tandem install panel && tandem panel init |
| 纯引擎 | npm 全局安装 | npm i -g @frumu/tandem && tandem-engine serve |
| 终端界面 | TUI | npm i -g @frumu/tandem-tui && tandem-tui |
| 自定义集成 | SDK | npm install @frumu/tandem-client |
资料来源:packages/tandem-control-panel/README.md:1-30
许可证说明
Tandem 采用开放核心(Open Core)许可模式:
| 组件 | 许可证 | 说明 |
|---|---|---|
| 运行时、协议、SDK、本地工具 | MIT / Apache-2.0 | permissive 开源许可 |
| tandem-plan-compiler | BUSL-1.1 | 任务/计划编译器,商业源码可用许可 |
| tandem-governance-engine | BUSL-1.1 | 递归治理引擎,商业源码可用许可 |
详细许可信息请参阅 docs/LICENSING.md。
资料来源:README.md:80-100
版本与发布
当前稳定版本为 Tandem v0.5.11 (2026-05-25):
Tandem 0.5.11 准备了托管企业引擎分发路径。此版本构建了包含浏览器自动化和企业完整路由的 Linux x64 tandem-engine 二进制文件,作为单独的企业发布资产发布,并添加了专用的 npm wrapper 用于托管 sidecar。
| 版本 | 发布日期 | 关键特性 |
|---|---|---|
| v0.5.11 | 2026-05-25 | 企业引擎分发路径、Linux x64 二进制、npm wrapper |
| v0.5.9 | 2026-04-xx | SDK 稳定版 |
资料来源:README.md:社区上下文
相关文档
资料来源:README.md:1-10
系统架构
Tandem 是一个本地优先、零信任的 AI 工作空间应用程序,采用分布式进程架构设计。本页面详细介绍 Tandem 的系统架构、核心组件、进程间通信机制以及各组件的职责划分。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
架构概览
Tandem 采用多进程架构,将桌面应用、引擎运行时和浏览器自动化能力解耦为独立进程,通过本地 HTTP/SSE API 进行通信。这种设计实现了关注点分离,使得各个组件可以独立开发、部署和扩展。
graph TD
subgraph Desktop["桌面端 (Tauri)"]
A[Tauri 应用主进程]
B[Web 控制面板]
C[技能系统]
D[模式系统]
E[内存系统]
end
subgraph Sidecar["Sidecar 进程"]
F[tandem-engine]
G[工具注册表]
H[提供商注册表]
end
subgraph Browser["浏览器自动化"]
I[tandem-browser]
J[Playwright 引擎]
end
subgraph External["外部服务"]
K[AI 提供商]
L[本地 Ollama]
M[MCP 连接器]
end
A -->|spawn| F
A -->|spawn| I
F -->|HTTP/SSE| B
F -->|API 调用| K
F -->|API 调用| L
F -->|MCP 协议| M
I -->|自动化| J资料来源:src-tauri/src/lib.rs:1-50
核心组件
桌面端主进程
桌面端采用 Tauri 框架构建,负责整个应用的生命周期管理、状态协调和用户界面呈现。
| 组件 | 源码位置 | 职责 |
|---|---|---|
| VaultState | lib.rs:60-75 | 保管库状态管理,存储主密钥和锁定状态 |
| SidecarManager | sidecar.rs:1-80 | Sidecar 进程启动、生命周期管理 |
| SidecarBinaryManager | sidecar_manager.rs:1-60 | 二进制版本跟踪、下载和更新 |
| SkillTemplates | skill_templates.rs | 技能模板管理 |
| ToolPolicy | tool_policy.rs | 工具调用策略控制 |
主进程通过 Manager trait 与 Tauri 运行时交互,并使用 StoreExt 扩展进行持久化状态存储:
use tauri::{Manager};
use tauri_plugin_store::StoreExt;
资料来源:src-tauri/src/lib.rs:35-45
Engine 引擎运行时
tandem-engine 是 Tandem 的核心推理引擎,以独立进程运行,提供 HTTP/SSE API 接口。
#### CLI 子命令
| 命令 | 功能 | 示例 |
|---|---|---|
serve | 启动 HTTP/SSE 运行时 | tandem-engine serve --hostname 0.0.0.0 --port 39731 |
status | 检查引擎健康状态 | tandem-engine status --hostname 127.0.0.1 --port 39731 |
run | 单次提示执行 | tandem-engine run "Summarize this" --provider openrouter --model openai/gpt-4o-mini |
tool | 直接工具执行 | tandem-engine tool --json @payload.json |
providers | 列出支持的提供商 | tandem-engine providers |
memory | 内存导入导出 | tandem-engine memory import --path ~/.openclaw --format openclaw |
#### 支持的 AI 提供商
引擎支持 12 个主流 AI 提供商,通过 ProviderRegistry 进行统一管理:
| 提供商 ID | 说明 |
|---|---|
openai | OpenAI GPT 系列 |
openrouter | OpenRouter 聚合服务 |
anthropic | Anthropic Claude 系列 |
ollama | 本地 Ollama 部署 |
groq | Groq 推理加速 |
mistral | Mistral AI |
together | Together AI |
azure | Azure OpenAI |
bedrock | AWS Bedrock |
vertex | Google Cloud Vertex AI |
copilot | GitHub Copilot |
cohere | Cohere |
const SUPPORTED_PROVIDER_IDS: [&str; 12] = [
"openai", "openrouter", "anthropic", "ollama", "groq",
"mistral", "together", "azure", "bedrock", "vertex",
"copilot", "cohere",
];
浏览器自动化组件
tandem-browser 是独立的浏览器自动化 Sidecar,通过 Playwright 提供浏览器控制能力。
#### 状态检测逻辑
flowchart LR
A[配置检查] --> B{browser.enabled?}
B -->|是| C{sidecar.found?}
B -->|否| D[runnable = false]
C -->|是| E{browser.found?}
C -->|否| F[添加阻塞问题]
E -->|是| G[runnable = true]
E -->|否| H[添加阻塞问题]状态检测会评估三个条件:
- 浏览器自动化是否启用
- Sidecar 二进制文件是否存在
- 本地浏览器是否可用
status.runnable = config.enabled
&& status.sidecar.found
&& status.browser.found
&& status.blocking_issues.is_empty();
资料来源:crates/tandem-server/src/browser_parts/part02.rs:30-60
进程间通信
HTTP/SSE 协议
引擎通过 HTTP REST API 和 Server-Sent Events (SSE) 提供双向通信能力。
sequenceDiagram
participant Client as TypeScript SDK
participant Engine as tandem-engine
participant Browser as tandem-browser
Client->>Engine: POST /sessions (创建会话)
Engine-->>Client: session_id
Client->>Engine: POST /sessions/{id}/prompt (发送提示)
Engine-->>Client: SSE stream (run.started)
Engine->>Browser: 浏览器自动化请求
Browser-->>Engine: 自动化结果
Engine-->>Client: SSE stream (session.response)
Engine-->>Client: SSE stream (run.complete)#### SDK 使用示例
import { TandemClient } from "@frumu/tandem-client";
const client = new TandemClient({
baseUrl: "http://localhost:39731",
token: "your-engine-token", // 从 tandem-engine token generate 获取
});
// 1. 创建会话
const sessionId = await client.sessions.create({
title: "My agent session",
directory: "/path/to/my/project",
});
// 2. 启动异步运行
const { runId } = await client.sessions.promptAsync(
sessionId,
"Summarize the README and list the top 3 TODOs"
);
// 3. 流式接收响应
for await (const event of client.stream(sessionId, runId)) {
if (event.type === "session.response") {
process.stdout.write(String(event.properties.delta ?? ""));
}
if (event.type === "run.complete" || event.type === "run.failed") {
break;
}
}
资料来源:packages/tandem-client-ts/README.md:20-50
API 参数配置
| 选项 | 类型 | 说明 |
|---|---|---|
baseUrl | string | 引擎服务地址,默认 http://localhost:39731 |
token | string | 引擎 API 令牌 |
timeout | number | 请求超时时间(毫秒) |
retries | number | 重试次数 |
Sidecar 进程管理
桌面端通过进程管理机制启动和控制 Engine Sidecar:
#### Windows 进程隔离
在 Windows 平台上,使用 Job Objects 实现进程隔离和资源控制:
#[cfg(windows)]
use windows_sys::Win32::System::JobObjects::{
AssignProcessToJobObject, CreateJobObjectW, JobObjectExtendedLimitInformation,
SetInformationJobObject, JOBOBJECT_EXTENDED_LIMIT_INFORMATION,
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE,
};
#### 进程启动参数
std::process::Command::new(path)
.arg("--version")
.output()
Sidecar 使用子进程方式启动,支持通过环境变量配置连接参数:
| 环境变量 | 默认值 | 说明 |
|---|---|---|
TANDEM_ENGINE_HOST | 127.0.0.1 | 引擎主机地址 |
TANDEM_ENGINE_PORT | 39731 | 引擎服务端口 |
TANDEM_BROWSER_SIDECAR | 自动检测 | 浏览器 Sidecar 路径 |
资料来源:src-tauri/src/sidecar.rs:20-40
版本管理与更新
Sidecar 二进制管理器
SidecarBinaryManager 负责从 GitHub releases 自动下载和更新二进制文件。
flowchart TD
A[启动检查] --> B{本地已安装?}
B -->|是| C{版本匹配?}
B -->|否| D[查询 GitHub API]
C -->|否| D
C -->|是| E[使用缓存]
D --> F[下载最新版本]
F --> G[验证二进制大小]
G --> H[缓存版本信息]
H --> I[启动进程]
style D fill:#f96
style F fill:#f96#### 版本检查配置
| 常量 | 值 | 说明 |
|---|---|---|
ENGINE_REPO | frumu-ai/tandem | GitHub 仓库 |
MIN_BINARY_SIZE | 100 * 1024 | 最小二进制大小(100KB) |
RELEASES_PER_PAGE | 20 | 每次请求的发布数 |
MAX_RELEASE_PAGES | 5 | 最大请求页数 |
RELEASE_CHECK_INTERVAL_SECS | 6 * 60 * 60 | 检查间隔(6小时) |
const RELEASE_REQUEST_TIMEOUT_SECS: u64 = 8;
const MIN_BINARY_SIZE: u64 = 100 * 1024; // 100KB minimum
资料来源:src-tauri/src/sidecar_manager.rs:10-30
核心模块架构
Tandem Core 库
tandem-core 是共享的基础库,提供核心类型定义和工具函数:
classDiagram
class ToolRegistry {
+register(tool: Tool)
+execute(name: String, args: JSON)
+list() Vec~Tool~
}
class ProviderRegistry {
+register(provider: Provider)
+get(id: String) Option~Provider~
+list_providers() Vec~String~
}
class RuntimeState {
+sessions: HashMap
+active_runs: HashMap
+memory_tiers: Vec
}
ToolRegistry --> ProviderRegistry
RuntimeState --> ToolRegistry关键导出项:
ToolRegistry- 工具注册与管理ProviderRegistry- AI 提供商注册与管理resolve_shared_paths()- 解析共享数据路径DEFAULT_ENGINE_PORT- 默认引擎端口 39731engine_api_token_file_path()- API 令牌文件路径
资料来源:crates/tandem-core/src/lib.rs
技能系统
技能(Skills)系统允许扩展 Tandem 的能力边界:
| 组件 | 说明 |
|---|---|
SkillInfo | 技能元数据 |
SkillContent | 技能内容定义 |
SkillLocation | 技能存储位置 |
SkillTemplateInfo | 技能模板信息 |
use tandem_skills::{SkillContent, SkillInfo, SkillLocation, SkillTemplateInfo};
资料来源:src-tauri/src/sidecar.rs:15-18
模式系统
模式(Modes)定义了不同的运行策略,包括 Plan Mode 和 Immediate Mode:
| 模式 | 行为 |
|---|---|
| Plan Mode | 先规划后执行,生成可审查的工作流 |
| Immediate | 直接执行,快速响应 |
部署架构
桌面端部署
graph LR
A[Tandem 桌面应用] --> B[启动 Sidecar]
B --> C[tandem-engine]
B --> D[tandem-browser]
C --> E[Web 控制面板]
E --> F[浏览器访问 :39734]企业版部署
v0.5.11 版本引入了企业版引擎分发路径:
| 组件 | 说明 |
|---|---|
tandem-engine (企业版) | 包含浏览器自动化和企业级路由的 Linux x64 二进制 |
@frumu/tandem (npm) | 企业版 Sidecar 的专用 npm 包装器 |
# 企业版安装
npm install -g @frumu/tandem
Docker 部署
提供了 Docker Compose 配置,支持容器化部署:
# 关键配置
engine:
port: 39731
token_file: ./secrets/tandem_api_token
panel:
port: 39734
depends_on: engine
资料来源:packages/tandem-control-panel/README.md
安全架构
零信任安全模型
Tandem 实现零信任安全架构,所有组件间通信都需要显式认证:
| 安全措施 | 实现 |
|---|---|
| API 令牌认证 | 通过 engine_api_token_file_path() 管理 |
| 进程隔离 | Windows Job Objects,Linux cgroups |
| 加密存储 | AES-256-GCM 加密提供商密钥 |
| 文件系统隔离 | 访问仅限于授权文件夹 |
pub struct VaultState {
pub unlocked: RwLock<bool>,
pub master_key: RwLock<Option<Vec<u8>>>,
pub app_data_dir: std::path::PathBuf,
}
资料来源:src-tauri/src/lib.rs:55-65
网络范围
| 组件 | 通信范围 | 说明 |
|---|---|---|
| 桌面运行时 → Sidecar | 127.0.0.1 | 仅本地通信 |
| Sidecar → AI 提供商 | 互联网 | 取决于配置的提供商 |
| Sidecar → 本地 Ollama | 本地网络 | 支持私有部署 |
遥测与隐私
- 无遥测:不包含分析或回传遥测
- 提供商流量:AI 请求仅发送到用户配置的端点
- 更新检查:仅 GitHub 端点
资料来源:README.md 安全和隐私部分
技术栈概览
| 层级 | 技术 | 源码位置 |
|---|---|---|
| 桌面框架 | Tauri | src-tauri/ |
| 核心引擎 | Rust + Tokio | engine/src/ |
| Web 控制面板 | React + TypeScript | packages/tandem-control-panel/ |
| SDK | TypeScript / Python | packages/tandem-client-ts/ |
| 浏览器自动化 | Playwright | tandem-browser/ |
引擎包结构
graph TD
A[tandem-engine] --> B[tandem-core]
A --> C[tandem-server]
A --> D[tandem-providers]
A --> E[tandem-tools]
A --> F[tandem-skills]
C --> G[tandem-plan-compiler]
G --> H[tandem-governance-engine]构建命令:
# 本地开发
cargo build -p tandem-engine
# 发布打包
cargo build --release -p tandem-engine
资料来源:engine/README.md
相关文档
- ENGINE_CLI.md - 引擎 CLI 参考手册
- ENGINE_COMMUNICATION.md - 桌面/运行时通信契约
- ENGINE_TESTING.md - 引擎测试与冒烟检查
- SECURITY.md - 安全威胁模型与报告流程
- LICENSING.md - 混合许可证说明
核心概念
Tandem 是一个本地优先、零信任的 AI 工作空间应用,其核心架构围绕自主代理引擎(tandem-engine)构建,支持多模型提供商路由、工具调用策略管理、内存系统和浏览器自动化能力。资料来源:README.md
继续阅读本节完整说明和来源证据。
本页面介绍 Tandem 的核心概念、架构组件、运行模式以及各子系统之间的协作关系,帮助开发者理解系统的设计哲学和使用方式。
来源:https://github.com/frumu-ai/tandem / 项目说明书
快速开始
本文档帮助你在本地快速部署并运行 Tandem AI 引擎。无论是桌面应用、Web 控制面板、命令行界面还是 SDK 集成,Tandem 都提供了灵活的入口方式。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
Tandem 是一个本地优先、零信任的 AI 工作空间应用,核心是头部的 tandem-engine 运行时引擎。该引擎支持多种 AI 提供商,包括 OpenAI、Anthropic、Ollama、Groq、Mistral、Azure 等 12 个主流服务提供商。
Tandem 的核心特性包括:
- 本地优先:数据优先存储在本地,不强制云端同步
- 零信任安全:不包含遥测追踪,提供加密凭证存储(AES-256-GCM)
- 提供商无关:可自由路由到用户配置的 AI 服务端点
- 可扩展架构:支持技能(Skills)、插件(Plugins)、MCP 协议
资料来源:README.md
安装方式
Tandem 提供多种安装路径,开发者可根据使用场景选择最适合的方案。
桌面应用(推荐新手)
桌面应用集成了完整的控制面板和引擎运行时,适合日常使用。
- 下载并安装 Tandem:tandem.ac
- 打开 Settings 添加提供商 API 密钥
- 选择工作区文件夹
- 开始使用任务提示,选择 Immediate 或 Plan Mode 模式
资料来源:README.md
Web 控制面板
Web 控制面板提供完整的图形化配置界面,适合服务器部署和远程访问。
npm i -g @frumu/tandem
tandem install panel
tandem panel init
资料来源:packages/tandem-control-panel/README.md
Docker 部署
对于容器化部署场景,Tandem 提供了开箱即用的 Docker Compose 配置:
# 从 tandem-control-panel 包中获取 docker-compose.yml
# 或使用 tandamd install panel 后在本地查找
docker-compose up -d
Docker 部署会将引擎和面板运行在同一 Docker 网络中,默认面板监听端口 39734。
资料来源:packages/tandem-control-panel/DOCKER.md
纯引擎运行时
如果只需要头部的引擎运行时(无图形界面),可通过 npm 全局安装:
npm install -g @frumu/tandem
tandem-engine serve --hostname 127.0.0.1 --port 39731
资料来源:README.md
终端界面(TUI)
对于命令行爱好者,Tandem 提供全屏终端用户界面:
npm i -g @frumu/tandem-tui && tandem-tui
可编辑面板脚手架
生成完全可定制的控制面板应用:
npm create tandem-panel@latest my-panel
cd my-panel
npm install
npm run dev
此方式允许开发者自定义路由、页面、主题、样式或运行时行为。
资料来源:README.md
引擎配置
环境变量配置
tandem-engine 支持通过环境变量进行配置:
| 环境变量 | 说明 | 默认值 |
|---|---|---|
TANDEM_ENGINE_HOST | 引擎监听主机地址 | 127.0.0.1 |
TANDEM_ENGINE_PORT | 引擎监听端口 | 39731 |
TANDEM_ENGINE_TOKEN | API 认证令牌 | 自动生成 |
TANDEM_STATE_DIR | 状态存储目录 | .tandem |
命令行参数
tandem-engine 支持多种子命令:
# 启动 HTTP/SSE 服务
tandem-engine serve --hostname 0.0.0.0 --port 39731
# 检查引擎健康状态
tandem-engine status --hostname 127.0.0.1 --port 39731
# 一次性执行提示
tandem-engine run "Summarize this repository" --provider openrouter --model openai/gpt-4o-mini
# 列出可用提供商
tandem-engine providers
# 导入记忆数据
tandem-engine memory import --path ./docs --tier project --project-id repo-123
AI 提供商配置
引擎支持的提供商列表:
| 提供商 ID | 说明 |
|---|---|
openai | OpenAI GPT 系列 |
openrouter | OpenRouter 聚合 |
anthropic | Anthropic Claude |
ollama | 本地 Ollama |
groq | Groq 推理 |
mistral | Mistral AI |
together | Together AI |
azure | Azure OpenAI |
bedrock | AWS Bedrock |
vertex | Google Vertex AI |
copilot | GitHub Copilot |
cohere | Cohere |
SDK 集成
TypeScript SDK
// npm install @frumu/tandem-client
import { TandemClient } from "@frumu/tandem-client";
const client = new TandemClient({
baseUrl: "http://localhost:39731",
token: "your-engine-token", // 从 `tandem-engine token generate` 获取
});
// 1. 创建会话
const sessionId = await client.sessions.create({
title: "My agent session",
directory: "/path/to/my/project",
});
// 2. 启动异步运行
const { runId } = await client.sessions.promptAsync(
sessionId,
"Summarize the README and list the top 3 TODOs"
);
// 3. 流式获取响应
for await (const event of client.stream(sessionId, runId)) {
if (event.type === "session.response") {
process.stdout.write(String(event.properties.delta ?? ""));
}
if (
event.type === "run.complete" ||
event.type === "run.completed" ||
event.type === "run.failed" ||
event.type === "session.run.finished"
)
break;
}
前置条件:需要 Node.js 18+(使用内置 fetch 和 ReadableStream)
资料来源:packages/tandem-client-ts/README.md
Python SDK
pip install tandem-client
from tandem_client import TandemClient
client = TandemClient(
base_url="http://localhost:39731",
token="your-engine-token"
)
session_id = client.sessions.create(
title="My agent session",
directory="/path/to/my/project"
)
result = client.sessions.prompt(session_id, "Summarize this repository")
print(result)
SDK 重要说明
注意:SDK 是 API 客户端,它们不包含 tandem-engine。
必须先运行 Tandem 运行时(桌面侧载或头部引擎),然后再使用 SDK 创建会话、触发运行和流式传输事件。
资料来源:README.md
认证与令牌管理
生成 API 令牌
首次启动引擎后,需要生成认证令牌:
tandem-engine token generate
Web 登录流程
托管部署场景下,控制面板支持浏览器 OAuth 登录:
- 打开控制面板登录页
- 选择 "Sign in with Tandem"
- 完成浏览器中的身份验证
- 返回控制面板继续使用
本地独立安装场景下,需要在控制台输入引擎令牌进行认证。
资料来源:packages/tandem-control-panel/src/app/LoginPage.tsx
工作流程图
graph TD
A[安装 Tandem] --> B{选择使用方式}
B -->|桌面应用| C[下载安装包]
B -->|Web 控制面板| D[npm 全局安装]
B -->|纯引擎| E[tandem-engine serve]
B -->|SDK 集成| F[安装 SDK 包]
C --> G[配置 AI 提供商]
D --> H[tandem panel init]
E --> G
F --> I[启动引擎]
G --> I
H --> I
I --> J[生成认证令牌]
J --> K[创建会话]
K --> L[提交任务提示]
L --> M[流式响应结果]常见问题
引擎启动失败
症状:tandem-engine serve 命令报错
排查步骤:
- 检查端口占用:
lsof -i :39731 - 确认 Node.js/npm 已正确安装
- 查看日志输出:
tandem-engine serve --verbose
找不到 tandem-browser 侧载
症状:浏览器自动化功能不可用
解决方案:
- 确保
tandem-browser二进制文件已安装 - 或设置环境变量:
TANDEM_BROWSER_SIDECAR=/path/to/tandem-browser - 或在配置文件中指定:
browser.sidecar_path
资料来源:crates/tandem-server/src/browser_parts/part02.rs
凭证存储加密
Tandem 使用 AES-256-GCM 加密存储提供商 API 密钥,存储位置由 tandem_core::resolve_shared_paths() 决定。
下一步
另请参阅
资料来源:README.md
桌面应用
Tandem 桌面应用是基于 Tauri 框架构建的安全、本地优先的 AI 工作空间客户端。它作为用户与 Tandem Engine 运行时之间的桥梁,提供图形界面、凭证管理、扩展管理和浏览器自动化等核心功能。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
核心架构
Tandem 桌面应用采用双进程架构:主进程(Rust/Tauri)与引擎 Sidecar 子进程通过本地回环地址(127.0.0.1)进行安全通信。
graph TD
subgraph Desktop["桌面应用 (Tauri Rust)"]
A[用户界面] --> B[命令层]
B --> C[状态管理]
C --> D[凭证存储 Vault]
C --> E[扩展管理]
C --> F[浏览器自动化]
end
subgraph Sidecar["引擎 Sidecar"]
G[tandem-engine 进程]
H[HTTP/SSE API]
I[工具执行器]
J[记忆系统]
end
K[Provider API] --> G
L[文件系统] --> G
Desktop <-->|127.0.0.1:39731| Sidecar
style Desktop fill:#e1f5fe
style Sidecar fill:#fff3e0资料来源:src-tauri/src/lib.rs:1-50
进程生命周期
桌面应用启动时执行以下初始化流程:
- 解析共享路径和配置目录
- 初始化日志系统(tracing + 非阻塞写入)
- 加载或创建引擎 API Token
- 启动/检测 Sidecar 进程状态
- 注册 Tauri 命令和事件处理器
资料来源:src-tauri/src/lib.rs:20-40
安全模型
Tandem 桌面应用实现了零信任(Zero-Trust)安全架构,默认拒绝敏感路径访问,并对所有外部通信进行严格控制。
安全特性
| 安全措施 | 说明 | 实现位置 |
|---|---|---|
| 凭证加密 | Provider API 密钥使用 AES-256-GCM 加密存储 | vault.rs |
| 文件系统隔离 | 访问权限限制在用户授权的文件夹内 | capabilities/ |
| 网络范围控制 | 仅与本地 Sidecar(127.0.0.1)和配置的 Provider 通信 | sidecar.rs |
| 敏感路径拒绝 | 关键系统路径默认禁止访问 | Tauri capabilities |
| 无遥测 | 不包含分析/追踪或回传机制 | 架构设计 |
资料来源:README.md 安全和隐私部分
Vault 状态管理
Vault 模块管理加密凭证的生命周期:
stateDiagram-v2
[*] --> Locked: 应用启动
Locked --> Unlocked: 用户解锁
Unlocked --> Locked: 锁定/退出
Unlocked --> [*]: 应用关闭
state Unlocked {
[*] --> HasMasterKey: 解密成功
HasMasterKey --> [*]: Token 可用
}资料来源:src-tauri/src/lib.rs:44-55
核心组件
Sidecar 管理器
Sidecar 管理器负责 Engine 进程的完整生命周期,包括检测、下载、更新和版本追踪。
资料来源:src-tauri/src/sidecar_manager.rs:1-40
| 功能 | 说明 |
|---|---|
| 版本检测 | 探测已安装 Engine 版本 |
| 发布检查 | 每 6 小时检查 GitHub Releases |
| 自动下载 | 下载并验证 Sidecar 二进制文件 |
| 缓存管理 | 维护发布版本缓存 |
Sidecar 进程通信
Sidecar 模块处理与 Engine 进程的进程间通信:
资料来源:src-tauri/src/sidecar.rs:1-50
sequenceDiagram
participant Desktop as 桌面应用
participant Sidecar as tandem-engine
participant Provider as AI Provider
Desktop->>Sidecar: 启动进程
Sidecar->>Desktop: 进程就绪
Desktop->>Sidecar: HTTP/SSE 请求
Sidecar->>Provider: API 调用
Provider-->>Sidecar: 响应数据
Sidecar-->>Desktop: SSE 流式事件扩展系统
桌面应用支持四类扩展,统一在扩展管理界面中管理:
资料来源:src/i18n/locales/en/common.json:20-35
| 扩展类型 | 说明 | 配置方式 |
|---|---|---|
| Skills | 可复用的任务模板和工作流 | 本地文件夹 |
| Plugins | 功能插件扩展 | 动态加载 |
| MCP | Model Context Protocol 连接器 | JSON 配置 |
| Modes | 高级运行模式 | 系统预设 |
用户界面
登录与认证
桌面应用支持两种认证模式:
资料来源:packages/tandem-control-panel/README.md:1-30
| 模式 | 适用场景 | 认证方式 |
|---|---|---|
| 本地安装 | 独立桌面部署 | Engine Token |
| 托管面板 | 企业托管服务 | 组织成员验证 |
工作区管理
用户首次使用时需要:
- 下载并启动 Tandem
- 在 Settings → Providers 中配置 API 密钥
- 或使用本地控制面板连接 Codex 账户
- 选择工作区文件夹
- 使用任务提示启动 Immediate 或 Plan Mode
资料来源:README.md 使用入门部分
配置与自定义
可编辑面板脚手架
开发者可以生成本地完全可编辑的控制面板应用:
npm create tandem-panel@latest my-panel
cd my-panel
npm install
npm run dev
此方式适用于需要自定义路由、页面、主题、样式或运行时行为的场景,无需修改 node_modules。
引擎配置
引擎支持通过命令行参数和环境变量配置:
tandem-engine serve --hostname 127.0.0.1 --port 39731
tandem-engine status --hostname 127.0.0.1 --port 39731
常见问题排查
Sidecar 相关问题
问题:tandem-browser sidecar binary was not found
解决方案:
- 安装或打包
tandem-browser - 设置环境变量
TANDEM_BROWSER_SIDECAR - 或在配置中设置
browser.sidecar_path
资料来源:crates/tandem-server/src/browser_parts/part02.rs:15-25
浏览器自动化状态检查
flowchart LR
A[检查配置] --> B{enabled?}
B -->|否| C[状态: 不运行]
B -->|是| D{browser found?}
D -->|否| E[阻塞问题: 浏览器未找到]
D -->|是| F{sidecar found?}
F -->|否| G[阻塞问题: Sidecar 未找到]
F -->|是| H[状态: 可运行]
E --> I[推荐解决方案]
G --> I资料来源:crates/tandem-server/src/browser_parts/part02.rs:10-35
引擎 Token 问题
如果面板无法连接 Engine,检查:
- Engine Token 是否生成:
tandem-engine token generate - Token 文件路径是否正确:
~/.tandem/tandem_api_token - Token 是否在浏览器和 Engine 间一致
许可证说明
Tandem 采用开放核心模式,许可证分布如下:
| 组件 | 许可证 |
|---|---|
核心引擎 (tandem-core, tandem-server 等) | MIT OR Apache-2.0 |
任务编译器 (tandem-plan-compiler) | BUSL-1.1 |
治理引擎 (tandem-governance-engine) | BUSL-1.1 |
资料来源:README.md 许可证部分
相关文档
- 架构概览 — 完整系统架构说明
- 引擎运行时与 CLI 参考 — 命令行工具完整文档
- 引擎通信协议 — 桌面与引擎间的通信契约
- 引擎测试 — 测试与冒烟检查指南
- Tandem MCP 文档 — MCP 集成配置
- 文档门户 — 官方文档中心
来源:https://github.com/frumu-ai/tandem / 项目说明书
引擎 CLI 与无头服务
Tandem Engine 是 Tandem 项目的核心无头(Headless)AI 后端运行时,提供 HTTP/SSE API 接口,支持模型无关的 AI 任务编排。引擎通过命令行接口(CLI)驱动,具备健康检查、会话管理、工具执行和内存导入等核心功能。开发者可通过 TypeScript SDK 或直接调用 REST API 与引擎交互,实现本地部署或远程托管的自定义 A...
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
Tandem Engine 是 Tandem 项目的核心无头(Headless)AI 后端运行时,提供 HTTP/SSE API 接口,支持模型无关的 AI 任务编排。引擎通过命令行接口(CLI)驱动,具备健康检查、会话管理、工具执行和内存导入等核心功能。开发者可通过 TypeScript SDK 或直接调用 REST API 与引擎交互,实现本地部署或远程托管的自定义 AI 工作流。
引擎的定位是 本地优先(Local-first) 的隐私保护型 AI 运行时,默认与桌面客户端的 Sidecar 进程通过 127.0.0.1 通信,确保数据不离开本地环境,除非用户显式配置外部 Provider 端点。资料来源:engine/src/main.rs:32-55
核心架构
进程模型
Tandem Engine 采用 Sidecar 模式 运行,主进程负责任务编排和 API 服务,辅助进程处理浏览器自动化等特定功能。该设计将计算密集型或系统级任务隔离到独立进程中,通过进程间通信协调工作。
graph TD
A[Desktop Client<br/>Tauri App] -->|IPC + SSE| B[Engine Main Process<br/>tandem-engine serve]
B --> C[Browser Sidecar<br/>tandem-browser]
B --> D[AI Provider API<br/>OpenAI/Anthropic/Ollama...]
E[External Agent<br/>MCP Client] -->|HTTP/SSE| B支持的 AI Provider
引擎支持 12 种主流 AI Provider,通过统一接口路由请求:
| Provider ID | 说明 | 认证方式 |
|---|---|---|
openai | OpenAI GPT 系列 | API Key |
openrouter | OpenRouter 聚合平台 | API Key |
anthropic | Anthropic Claude 系列 | API Key |
ollama | 本地 Ollama 部署 | 本地/自定义端点 |
groq | Groq 加速推理 | API Key |
mistral | Mistral AI | API Key |
together | Together AI | API Key |
azure | Azure OpenAI Service | Azure 凭证 |
bedrock | AWS Bedrock | AWS 凭证 |
vertex | Google Vertex AI | GCP 凭证 |
copilot | GitHub Copilot | OAuth |
cohere | Cohere Command | API Key |
命令行接口
全局命令结构
tandem-engine CLI 采用子命令架构,主要包含以下操作:
tandem-engine [GLOBAL_OPTIONS] <COMMAND> [ARGS]
| 命令 | 功能 | 典型用途 |
|---|---|---|
serve | 启动 HTTP/SSE 服务 | 作为后台常驻进程 |
status | 健康检查 | 验证引擎运行状态 |
run | 单次提示执行 | 快速测试和脚本集成 |
tool | 直接工具调用 | 调试和自动化任务 |
providers | 列出可用 Provider | 配置验证 |
memory | 内存导入导出 | 数据迁移和备份 |
token | 令牌管理 | API 认证配置 |
常用命令示例
#### 启动服务
# 默认配置启动(localhost:39731)
tandem-engine serve
# 指定端口和网络接口
tandem-engine serve --hostname 0.0.0.0 --port 39731
# 带状态目录的持久化启动
tandem-engine serve --state-dir .tandem-state --provider openrouter --model openai/gpt-4o-mini
#### 健康检查
# 默认检查
tandem-engine status
# 指定目标
tandem-engine status --hostname 127.0.0.1 --port 39731
#### 单次任务执行
tandem-engine run "Summarize this repository" --provider openrouter --model openai/gpt-4o-mini
#### 工具直接调用
# 从文件加载 JSON payload
tandem-engine tool --json @payload.json
# 从标准输入读取
cat payload.json | tandem-engine tool --json -
#### 内存导入
# 导入 OpenClaw 格式数据
tandem-engine memory import --path ~/.openclaw --format openclaw
# 导入到项目级别存储
tandem-engine memory import --path ./docs --tier project --project-id repo-123 --sync-deletes
服务配置
环境变量
| 变量名 | 默认值 | 说明 |
|---|---|---|
TANDEM_ENGINE_HOST | 127.0.0.1 | 服务监听地址 |
TANDEM_ENGINE_PORT | 39731 | 服务监听端口 |
TANDEM_API_TOKEN | 自动生成 | API 认证令牌 |
TANDEM_STATE_DIR | .tandem | 状态持久化目录 |
TANDEM_BROWSER_SIDECAR | 自动检测 | 浏览器 Sidecar 路径 |
BUN_JSC_forceRAMSize | 268435456 | Bun 内存限制(字节) |
BUN_GARBAGE_COLLECTOR_LEVEL | 1 | GC 激进程度 |
Sidecar 管理
引擎的浏览器自动化功能依赖独立的 tandem-browser Sidecar 进程。引擎会自动检测二进制文件位置:
- 显式配置:
browser.sidecar_path或TANDEM_BROWSER_SIDECAR环境变量 - 托管安装:
<shared_root>/binaries/tandem-browser - 共享路径解析:
tandem-core::resolve_shared_paths()返回的规范根目录
Sidecar 版本探测通过执行 --version 参数验证,失败时记录警告但不影响核心功能。
graph LR
A[Engine Start] --> B{Has explicit<br/>sidecar_path?}
B -->|Yes| C[Use explicit path]
B -->|No| D{Managed path<br/>exists?}
D -->|Yes| C
D -->|No| E[Search PATH]
E --> F{Found<br/>tandem-browser?}
F -->|Yes| C
F -->|No| G[Mark unavailable<br/>Continue without browser]
C --> H[Probe version<br/>with --version]资料来源:crates/tandem-server/src/browser_parts/part02.rs:45-85
浏览器功能状态检测
引擎启动时执行完整的浏览器子系统检测:
| 状态字段 | 类型 | 说明 |
|---|---|---|
runnable | bool | 是否可执行浏览器任务 |
blocking_issues | Issue[] | 阻止性问题列表 |
recommendations | string[] | 修复建议 |
阻塞问题代码:
browser_sidecar_not_found:Sidecar 二进制文件缺失browser_not_found:本地浏览器未安装version_mismatch:版本不兼容
资料来源:crates/tandem-server/src/browser_parts/part02.rs:28-50
API 认证
令牌管理
引擎使用文件存储的 API 令牌进行认证,令牌文件路径由 tandem_core::engine_api_token_file_path() 确定。
# 生成新令牌
tandem-engine token generate
# 查看当前令牌
tandem-engine token show
TypeScript SDK 认证
import { TandemClient } from "@frumu/tandem-client";
const client = new TandemClient({
baseUrl: "http://localhost:39731",
token: "your-engine-token", // 从 tandem-engine token generate 获取
});
SDK 需要 Node 18+ 环境,利用内置的 fetch 和 ReadableStream API。
资料来源:packages/tandem-client-ts/README.md:25-40
TypeScript 客户端使用
完整工作流程
import { TandemClient } from "@frumu/tandem-client";
const client = new TandemClient({
baseUrl: "http://localhost:39731",
token: "your-engine-token",
});
// 1. 创建会话
const sessionId = await client.sessions.create({
title: "My agent session",
directory: "/path/to/my/project",
});
// 2. 启动异步运行
const { runId } = await client.sessions.promptAsync(
sessionId,
"Summarize the README and list the top 3 TODOs"
);
// 3. 流式获取响应
for await (const event of client.stream(sessionId, runId)) {
if (event.type === "session.response") {
process.stdout.write(String(event.properties.delta ?? ""));
}
if (
event.type === "run.complete" ||
event.type === "run.completed" ||
event.type === "run.failed" ||
event.type === "session.run.finished"
) {
break;
}
}
SSE 事件类型
| 事件类型 | 说明 | 典型 Payload |
|---|---|---|
session.response | 响应片段 | { delta: string } |
run.complete | 运行成功完成 | { output: any } |
run.completed | 运行完成(别名) | { output: any } |
run.failed | 运行失败 | { error: string } |
session.run.finished | 会话运行结束 | { runId: string } |
资料来源:packages/tandem-client-ts/README.md:45-75
打包与分发
npm 包结构
#### @frumu/tandem-ai - CLI 安装器
核心 npm 包,提供 tandem CLI 命令:
{
"name": "tandem-ai",
"version": "0.5.9",
"description": "Tandem authority-layer runtime CLI installer/launcher",
"bin": {
"tandem": "bin/tandem.js"
},
"publishConfig": {
"access": "public"
}
}
#### @frumu/tandem-client - TypeScript SDK
类型安全的引擎客户端库:
{
"name": "@frumu/tandem-client",
"version": "0.5.9",
"engines": {
"node": ">=18"
},
"dependencies": {
"zod": "^4.3.6"
}
}
引擎构建
Rust 引擎可通过 Cargo 构建:
# 构建 tandem-engine
cargo build -p tandem-engine
# 运行测试
cargo test -p tandem-engine --no-run
# 构建发布版本
cargo build -p tandem-engine --release
# 打包发布
cargo package -p tandem-engine
企业版发布 (v0.5.11+)
v0.5.11 版本开始提供独立的企业版发行资产:
- Linux x64 二进制:包含浏览器自动化和企业级完整路由
- 专用 npm wrapper:用于托管 Sidecar 部署
内存与存储
存储层级
| 层级 | 作用域 | 典型用途 |
|---|---|---|
global | 全局共享 | 跨项目通用知识 |
project | 单个项目 | 项目特定上下文 |
session | 单次会话 | 临时工作状态 |
导入格式
引擎支持多种导入格式,核心是 OpenClaw 兼容格式:
# 导入 OpenClaw 格式
tandem-engine memory import --path ~/.openclaw --format openclaw
# 指定导入层级
tandem-engine memory import --path ./notes --tier global
tandem-engine memory import --path ./docs --tier project --project-id repo-123
# 同步删除操作
tandem-engine memory import --path ./docs --tier project --sync-deletes
数据文件位置
数据默认存储在以下位置之一:
tandem_core::resolve_shared_paths().canonical_root~/.tandem(回退位置)- 当前目录
./.tandem(最后回退)
资料来源:crates/tandem-server/src/browser_parts/part02.rs:88-98
故障排查
常见问题
#### 1. Sidecar 二进制未找到
症状:browser_sidecar_not_found 错误
排查步骤:
- 检查环境变量
TANDEM_BROWSER_SIDECAR - 验证托管路径
<root>/binaries/tandem-browser存在 - 确认文件系统权限
#### 2. 版本探测失败
症状:version probe failed 错误
排查步骤:
- 手动执行
<sidecar_path> --version验证可执行性 - 检查 stderr 输出
- 确认二进制架构匹配(x64/arm64)
#### 3. 内存占用过高
症状:Bun/JSC 进程空闲时内存超过 500MB
解决方案:引擎自动设置以下环境变量限制内存:
BUN_JSC_forceRAMSize=268435456(256MB)BUN_GARBAGE_COLLECTOR_LEVEL=1
这些设置仅在变量未显式配置时生效。
#### 4. Provider 连接失败
排查矩阵:
| Provider | 检查项 | 配置位置 |
|---|---|---|
ollama | 本地服务是否运行 | OLLAMA_HOST 环境变量 |
openai | API Key 有效性 | Provider 配置 |
azure | Azure 端点和密钥 | AZURE_OPENAI_* 环境变量 |
bedrock | AWS 凭证 | 标准 AWS 凭证链 |
日志调试
引擎日志输出到:
- 标准输出/标准错误(前台模式)
- Tauri 日志系统(桌面集成)
日志级别通过 RUST_LOG 环境变量控制:
RUST_LOG=debug tandem-engine serve
进程生命周期
启动序列
sequenceDiagram
participant CLI as CLI / Main
participant Core as tandem-core
participant Server as tandem-server
participant Sidecar as Browser Sidecar
CLI->>Core: resolve_shared_paths()
CLI->>Core: load_or_create_engine_api_token()
Core-->>CLI: paths, token
CLI->>Server: start_http_server()
Server->>Server: load_capabilities()
Server->>Sidecar: detect_sidecar_binary_path()
Sidecar-->>Server: path_option
Server->>Sidecar: probe_binary_version()
alt sidecar found
Server->>Sidecar: spawn_sidecar_process()
Sidecar-->>Server: running
else sidecar not found
Server-->>Server: continue_without_browser
end
Server-->>CLI: HTTP server ready优雅关闭
引擎支持以下关闭信号:
SIGTERM/SIGINT:标准终止信号- Windows Job Objects:进程树统一终止(通过
SetInformationJobObject)
资料来源:src-tauri/src/sidecar.rs:55-80
安全考量
零信任架构
- 网络范围:桌面运行时仅与
127.0.0.1通信 - 凭证存储:Provider API Key 使用 AES-256-GCM 加密
- 文件系统:访问限于授权文件夹,敏感路径默认拒绝
凭证更新
Sidecar 进程启动时接收环境变量形式的凭证:
for (key, value) in env_vars.iter() {
cmd.env(key, value);
}
cmd.env("TANDEM_API_TOKEN", &self.api_token);
每次 Provider 配置变更后,新凭证通过 Sidecar 重启生效。
相关文档
- 架构概述 — 完整的系统架构图
- 引擎通信协议 — Desktop/Engine 通信契约
- 引擎测试指南 — 单元测试和冒烟测试
- Tandem MCP 文档 — MCP 接口集成
- SDK 参考 — TypeScript 客户端完整 API
参见
- 许可证说明 — 混合许可模型说明
- 安全策略 — 威胁模型和漏洞报告流程
- Tandem 官方文档 — 用户文档门户
SDK 参考文档
Tandem SDK 是一套跨语言的 API 客户端库,用于与 Tandem Engine 运行时进行交互。SDK 不包含 tandem-engine 二进制文件,而是作为轻量级客户端,通过 HTTP/SSE 协议与运行中的引擎实例通信。
继续阅读本节完整说明和来源证据。
概述
Tandem SDK 是一套跨语言的 API 客户端库,用于与 Tandem Engine 运行时进行交互。SDK 不包含 tandem-engine 二进制文件,而是作为轻量级客户端,通过 HTTP/SSE 协议与运行中的引擎实例通信。
核心能力:
- 创建和管理会话(Sessions)
- 触发任务执行(Runs)
- 流式接收事件和响应(Streaming Events)
- 管理工具注册表和 MCP 连接
- 访问权限控制的记忆存储
SDK 与引擎的关系:
graph LR
subgraph "SDK 层(客户端)"
TS_SDK[TypeScript SDK<br/>@frumu/tandem-client]
PY_SDK[Python SDK<br/>tandem-client]
end
subgraph "运行时层(服务端)"
DESKTOP[桌面端内置 Sidecar]
HEADLESS[tandem-engine serve<br/>headless 模式]
end
subgraph "模型层"
MODELS[OpenAI / Anthropic /<br/>Ollama / OpenRouter]
end
TS_SDK -->|HTTP/SSE| DESKTOP
PY_SDK -->|HTTP/SSE| DESKTOP
TS_SDK -->|HTTP/SSE| HEADLESS
PY_SDK -->|HTTP/SSE| HEADLESS
DESKTOP --> MODELS
HEADLESS --> MODELS资料来源:README.md
来源:https://github.com/frumu-ai/tandem / 项目说明书
MCP 集成
MCP(Model Context Protocol)集成是 Tandem 实现 AI 代理能力扩展的核心机制。通过 MCP 协议,Tandem 可以连接外部工具、数据源和服务,使 AI 代理能够执行多样化的任务,如网络研究、社区数据收集、文档检索等。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
MCP(Model Context Protocol)集成是 Tandem 实现 AI 代理能力扩展的核心机制。通过 MCP 协议,Tandem 可以连接外部工具、数据源和服务,使 AI 代理能够执行多样化的任务,如网络研究、社区数据收集、文档检索等。
Tandem 的 MCP 集成采用零信任安全模型,所有 MCP 工具调用都经过权限验证和策略控制,确保敏感操作得到适当的授权审批。资料来源:docs/MCP_IMPROVEMENTS.md
核心架构
flowchart TD
subgraph 核心层["Tandem 核心引擎"]
MCP["MCP 运行时<br/>(tandem-runtime)"]
Catalog["MCP 目录服务<br/>(mcp_catalog)"]
Policy["工具策略引擎<br/>(tool_policy)"]
Discovery["能力发现模块<br/>(mcp_ready)"]
end
subgraph MCP服务层["MCP 服务器连接"]
TandemMCP["tandem_mcp<br/>文档检索工具"]
Composio["composio<br/>第三方集成"]
CustomMCP["自定义 MCP 服务器"]
end
subgraph 代理层["AI 代理"]
Planner["任务规划代理"]
Researcher["研究代理"]
Synthesizer["综合代理"]
end
subgraph 外部服务["外部服务"]
Reddit["Reddit API"]
Notion["Notion API"]
Web["Web 研究服务"]
end
Planner --> MCP
Researcher --> MCP
Synthesizer --> MCP
MCP --> Catalog
MCP --> Policy
MCP --> Discovery
Discovery -.->|能力列表| Planner
MCP --> TandemMCP
MCP --> Composio
Composio --> Reddit
TandemMCP --> Web
Policy -.->|审批结果| MCPMCP 目录与注册
Tandem 维护一个集中的 MCP 服务器目录,位于 crates/tandem-server/resources/mcp-catalog/index.json。该目录定义了所有可用的 MCP 服务器及其配置。
目录结构
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | MCP 服务器唯一标识符 |
name | string | 显示名称 |
capabilities | array | 支持的工具能力列表 |
auth | object | 认证配置(OAuth/API Key) |
scopes | array | 权限范围 |
资料来源:crates/tandem-server/resources/mcp-catalog/index.json
内置 MCP 服务器
Tandem 预置了以下 MCP 服务器连接:
| MCP 服务器 | 功能描述 | 权限范围 |
|---|---|---|
tandem_mcp | Tandem 内部文档检索与搜索 | search_docs, get_doc |
composio.reddit | Reddit 社区数据收集 | reddit_get_subreddits_search, reddit_search_across_subreddits, reddit_retrieve_reddit_post |
composio.notion | Notion 页面创建与更新 | 写入选定的 collection |
资料来源:crates/tandem-plan-compiler/src/workflow_plan_parts/part02.rs:1-50
能力发现与请求流程
发现机制
Tandem 实现了完整的能力发现机制,确保 AI 代理在执行任务前了解可用的 MCP 工具。发现流程遵循以下原则:
- 启动时扫描:引擎启动时扫描所有已配置的 MCP 服务器
- 动态更新:当 MCP 服务器配置变更时,实时更新能力清单
- 按需暴露:根据当前任务上下文,仅暴露相关工具能力
sequenceDiagram
participant Agent as AI 代理
participant Discovery as 能力发现模块
participant Catalog as MCP 目录
participant Runtime as MCP 运行时
participant Policy as 策略引擎
Agent->>Discovery: 请求任务所需能力
Discovery->>Catalog: 查询可用工具列表
Catalog-->>Discovery: 返回能力清单
Discovery->>Policy: 验证能力访问权限
Policy-->>Discovery: 返回授权结果
Discovery-->>Agent: 返回已授权能力列表
Agent->>Runtime: 调用工具
Runtime->>Policy: 请求执行授权
Policy-->>Runtime: 审批/拒绝资料来源:guide/src/content/docs/mcp-capability-discovery-and-request-flow.md
请求授权流程
每个 MCP 工具调用都需要经过授权检查:
- 代理发起工具调用请求
- 策略引擎评估请求的风险级别
- 根据配置决定自动批准或触发人工审批
- 返回执行结果或审批请求
工作流集成
规划代理中的 MCP 使用
Tandem 的任务规划代理(agent_planner)在执行复杂研究任务时,会协调多个 MCP 工具的调用。以下是一个典型的研究-综合工作流:
| 阶段 | 代理角色 | MCP 工具调用 | 说明 |
|---|---|---|---|
| 范围确认 | agent_research_planner | - | 确认任务范围和目标 |
| 文档研究 | agent_docs_researcher | mcp.tandem_mcp.search_docs, mcp.tandem_mcp.get_doc | 检索 Tandem 内部文档 |
| 市场研究 | agent_market_researcher | web_research, web_fetch | 收集外部市场信息 |
| 社区信号 | agent_community_researcher | mcp.composio.reddit_* | 收集 Reddit 讨论 |
| 综合报告 | agent_synthesizer | mcp.composio.notion | 输出到 Notion |
资料来源:crates/tandem-plan-compiler/src/workflow_plan_parts/part02.rs:20-80
工作流步骤定义
每个工作流步骤包含以下元数据:
{
"step_id": "generated_step_02",
"kind": "research",
"objective": "使用 mcp.tandem_mcp.search_docs 获取可靠的工作流设计文档。",
"agent_role": "agent_docs_researcher",
"input_refs": [],
"depends_on": ["generated_step_01"],
"output_contract": {
"kind": "structured_json"
}
}
桌面客户端配置
MCP 设置界面
在 Tandem 桌面应用的扩展设置中,可以管理 MCP 配置:
| 标签页 | 功能 |
|---|---|
| Skills | 技能管理 |
| Plugins | 插件管理 |
| MCP | MCP 服务器连接配置 |
| Modes | 运行模式设置 |
资料来源:src/i18n/locales/en/common.json
MCP 服务器配置
配置 MCP 服务器时,需要提供以下信息:
| 配置项 | 必填 | 说明 |
|---|---|---|
| 服务器 ID | 是 | MCP 服务器的唯一标识 |
| 连接地址 | 是 | MCP 服务器的 URL 或本地路径 |
| 认证方式 | 否 | OAuth 2.0 或 API Key |
| 权限范围 | 是 | 允许使用的工具列表 |
安全与策略
零信任安全模型
Tandem 对所有 MCP 交互实施零信任安全原则:
- 最小权限:代理仅获得完成任务所需的最小权限集
- 显式授权:每个敏感操作都需要显式授权
- 审计追踪:所有 MCP 调用都被记录用于审计
策略执行点
| 策略检查点 | 检查内容 |
|---|---|
| 连接建立 | MCP 服务器身份验证 |
| 工具发现 | 能力清单访问权限 |
| 工具调用 | 操作类型和参数验证 |
| 数据访问 | 资源范围和敏感度评估 |
浏览器自动化集成
Tandem 支持通过专用的 tandem-browser sidecar 实现浏览器自动化能力。这项功能依赖于 MCP 协议与浏览器的通信。
状态检查
浏览器自动化组件会执行以下状态检查:
| 检查项 | 状态字段 | 说明 |
|---|---|---|
| Sidecar 发现 | sidecar.found | tandem-browser 二进制文件是否存在 |
| Sidecar 版本 | sidecar.version | 已安装的版本号 |
| 浏览器引擎 | browser.found | 浏览器引擎可用性 |
资料来源:crates/tandem-server/src/browser_parts/part02.rs
Sidecar 自动下载
对于托管部署场景,Tandem 支持自动下载和管理浏览器 sidecar:
# 配置浏览器 sidecar 路径
TANDEM_BROWSER_SIDECAR=/custom/path/tandem-browser
# 或在配置文件中设置
browser:
sidecar_path: /custom/path/tandem-browser
常见配置问题
MCP 连接失败排查
| 问题症状 | 可能原因 | 解决方案 |
|---|---|---|
| 连接超时 | 网络隔离或防火墙 | 检查网络配置,确保 127.0.0.1 访问 |
| 认证失败 | API Key 过期或权限不足 | 更新凭证或扩展权限范围 |
| 工具未发现 | MCP 服务器未启动 | 确认 MCP 服务器进程运行中 |
Sidecar 下载失败
当浏览器自动化 sidecar 下载失败时:
- 检查 GitHub API 访问权限(可能存在速率限制)
- 手动下载对应平台的 release asset
- 通过
--browser-sidecar参数指定本地路径
参考文档
另请参阅
智能体 Pack 系统
Tandem 的 智能体 Pack 系统(Agent Pack System)是一个结构化的任务封装框架,旨在为用户提供可复制、即开即用的智能体工作流解决方案。Pack 将提示词模板、参考文档、示例输入和工作流程配置打包为独立的文件夹,使用户能够快速启动特定领域的自动化任务。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
什么是 Pack
Pack 是一种引导式、可复制的工作流文件夹,专门设计用于实际生产任务。每个 Pack 包含启动指南、提示词模板和示例输入,使智能体能够快速适应特定领域的工作需求。
资料来源:agent-templates/PACKS.md:1-10
Pack 的核心价值
| 价值主张 | 说明 |
|---|---|
| 开箱即用 | 包含 START_HERE.md 启动指南,无需从零配置 |
| 领域适配 | 针对特定场景(研究、金融、生物信息学等)优化 |
| 可复制性 | 文件夹结构标准化,便于分发和版本管理 |
| 渐进引导 | 提供示例输入和预期输出,帮助用户理解工作流 |
资料来源:src/i18n/locales/en/common.json
Pack 与其他扩展的关系
Tandem 提供了多种扩展机制来增强智能体能力:
graph TD
A[Tandem 扩展系统] --> B[Pack 系统]
A --> C[Skills 技能]
A --> D[Plugins 插件]
A --> E[MCP 模型上下文协议]
A --> F[Modes 运行模式]
B --> B1[引导式工作流]
B --> B2[领域提示词]
B --> B3[示例数据]
C --> C1[特定任务能力]
D --> D1[功能增强]
E --> E1[外部工具集成]Pack 作为用户可直接使用的高层次封装,专注于完整工作流的提供,而 Skills、Plugins 和 MCP 则提供了更细粒度的功能扩展能力。
Pack 目录结构
标准 Pack 结构
每个 Pack 文件夹遵循统一的标准结构:
{pack-name}/
├── PACK_INFO.md # Pack 元数据配置
├── START_HERE.md # 启动指南
├── prompts/ # 提示词模板目录
│ ├── main.md # 主提示词
│ └── variants/ # 变体提示词
├── inputs/ # 示例输入目录
│ ├── sample1.md # 示例输入 1
│ └── sample2.md # 示例输入 2
└── configs/ # 可选配置文件
└── workflow.json # 工作流配置
资料来源:agent-templates/pack-docs/bio-informatics-pack/PACK_INFO.md
PACK_INFO.md 元数据规范
企业级功能
Tandem v0.5.11 引入了完善的企业级功能集,为组织提供了在托管环境中部署和运行自主 AI 工作空间的能力。本页面详细介绍 Tandem 的企业级架构、部署模式、安全特性、合规支持以及 SDK 集成方案。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
功能概览
Tandem 企业级功能旨在满足以下核心需求:
| 功能类别 | 描述 | 适用场景 |
|---|---|---|
| 托管引擎分发 | 独立的 Linux x64 二进制分发包 | VPS、服务器部署 |
| 企业级路由 | 完整的路由能力与浏览器自动化集成 | 复杂工作流自动化 |
| 托管 Sidecar 包装器 | 专用 npm 包用于托管环境 | 云原生部署 |
| 治理引擎 | 递归策略执行与合规检查 | 企业政策合规 |
| 多提供商支持 | 支持 12+ AI 提供商 | 灵活的模型选择 |
| 零信任安全 | 端到端加密与凭证保护 | 数据敏感环境 |
资料来源:docs/ENTERPRISE_READINESS.md
企业架构
系统组件架构
graph TD
subgraph "企业托管层"
A[企业控制面板] --> B[tandem-engine]
B --> C[治理引擎]
B --> D[计划编译器]
end
subgraph "运行时层"
B --> E[Sidecar 进程]
E --> F[浏览器自动化]
E --> G[工具执行]
end
subgraph "提供商层"
H[OpenAI]
I[Anthropic]
J[Ollama]
K[Azure]
L[其他提供商]
end
G --> H
G --> I
G --> J
G --> K
G --> L
C --> M[合规策略检查]
M --> N[EU AI Act]
M --> O[企业数据策略]资料来源:crates/tandem-enterprise-server/src/lib.rs
引擎服务架构
graph LR
A[Engine CLI] -->|serve 命令| B[HTTP Server]
B --> C[Provider Router]
C --> D[Tool Registry]
C --> E[Skill Manager]
F[Enterprise Contract] -->|策略定义| G[Governance Engine]
G -->|合规检查| H[Policy Gate]
I[Sidecar Manager] -->|生命周期| J[Browser Automation]
I -->|版本管理| K[Release Cache]资料来源:engine/src/main.rs 和 crates/tandem-governance-engine/src/lib.rs
部署模式
Tandem 企业版支持多种部署模式,以适应不同的基础设施需求。
托管模式
托管模式适用于需要集中管理的组织:
# 安装托管引擎
npm i -g @frumu/tandem-engine
# 启动托管引擎服务
tandem-engine serve --hostname 0.0.0.0 --port 39731
资料来源:packages/tandem-engine
托管 Sidecar 模式
v0.5.11 新增了专用的托管 Sidecar npm 包装器,提供更好的云原生集成:
| 配置项 | 说明 | 默认值 |
|---|---|---|
sidecar_path | Sidecar 二进制路径 | ~/.tandem/binaries/ |
TANDEM_BROWSER_SIDECAR | 浏览器 Sidecar 环境变量 | - |
browser.sidecar_path | 配置文件中的路径 | - |
资料来源:src-tauri/src/sidecar_manager.rs
容器化部署
Tandem 提供 Docker Compose 配置用于容器化部署:
# 标准配置
services:
engine:
image: tandem-engine:latest
ports:
- "39731:39731"
volumes:
- ./secrets:/secrets
panel:
image: tandem-panel:latest
ports:
- "39734:39734"
depends_on:
- engine
资料来源:packages/tandem-control-panel/DOCKER.md
企业安全特性
零信任安全模型
Tandem 企业版实现了完整的零信任安全架构:
| 安全层级 | 保护机制 | 实现方式 |
|---|---|---|
| 传输加密 | API Token 认证 | tandem-engine token generate 生成令牌 |
| 凭证存储 | AES-256-GCM 加密 | src-tauri/src/keystore.rs |
| 文件系统隔离 | 作用域化访问 | 仅允许授权文件夹访问 |
| 敏感路径保护 | 默认拒绝策略 | src-tauri/src/tool_policy.rs |
| 遥测控制 | 无追踪/无遥测 | README.md 安全声明 |
资料来源:README.md - 安全和隐私
凭证管理
sequenceDiagram
participant User as 用户
participant App as Tandem App
participant Vault as 加密保险库
participant Engine as tandem-engine
User->>App: 输入 API Key
App->>Vault: 加密存储
App->>Engine: 请求 Token
Engine->>Vault: 验证并解密
Vault->>Engine: 返回凭证
Engine->>Provider: AI 请求资料来源:src-tauri/src/lib.rs - VaultState
合规支持
EU AI Act 合规
Tandem 企业版针对 EU AI Act 提供了专门的合规支持模块:
| 合规要求 | 实现状态 | 相关模块 |
|---|---|---|
| 透明度报告 | ✅ 支持 | 遥测日志 |
| 数据处理记录 | ✅ 支持 | 工具历史 |
| 人工监督接口 | ✅ 支持 | Plan Mode |
| 风险评估 | ✅ 支持 | 治理引擎 |
| 合规审计日志 | ✅ 支持 | 观测性模块 |
资料来源:docs/EU_AI_ACT_COMPLIANCE.md 和 docs/compliance/README.md
治理策略执行
企业治理引擎负责递归策略检查:
// 治理引擎核心接口
pub struct GovernancePolicy {
pub allowed_providers: Vec<ProviderId>,
pub denied_tools: Vec<ToolId>,
pub audit_enabled: bool,
pub compliance_mode: ComplianceLevel,
}
资料来源:crates/tandem-enterprise-contract/src/governance.rs
SDK 与 API 集成
TypeScript SDK
企业应用可以通过官方 SDK 集成 Tandem 引擎:
import { TandemClient } from "@frumu/tandem-client";
const client = new TandemClient({
baseUrl: "http://localhost:39731",
token: process.env.TANDEM_API_TOKEN,
});
// 创建会话
const sessionId = await client.sessions.create({
title: "企业分析任务",
directory: "/path/to/project",
});
// 异步执行任务
const { runId } = await client.sessions.promptAsync(
sessionId,
"分析代码库并生成报告"
);
// 事件流
for await (const event of client.stream(sessionId, runId)) {
console.log(event);
}
资料来源:packages/tandem-client-ts/README.md
支持的 AI 提供商
Tandem 企业版支持以下 AI 提供商的无缝集成:
| 提供商 | ID | 配置要求 |
|---|---|---|
| OpenAI | openai | API Key |
| OpenRouter | openrouter | API Key |
| Anthropic | anthropic | API Key |
| Ollama | ollama | 本地端点 |
| Groq | groq | API Key |
| Mistral | mistral | API Key |
| Together AI | together | API Key |
| Azure OpenAI | azure | Azure 凭证 |
| AWS Bedrock | bedrock | AWS 凭证 |
| Google Vertex | vertex | GCP 凭证 |
| GitHub Copilot | copilot | OAuth/Token |
| Cohere | cohere | API Key |
资料来源:engine/src/main.rs - SUPPORTED_PROVIDER_IDS
HTTP API 合约
企业服务通过标准 HTTP API 与引擎通信:
| 端点 | 方法 | 描述 |
|---|---|---|
/api/v1/sessions | POST | 创建会话 |
/api/v1/sessions/:id/prompt | POST | 发送提示 |
/api/v1/stream | GET | SSE 事件流 |
/api/v1/status | GET | 引擎状态 |
/api/v1/providers | GET | 提供商列表 |
资料来源:contracts/http.md
版本与分发
企业版发布流程
v0.5.11 引入的企业版发布机制:
graph LR
A[源码构建] --> B[标准构建]
A --> C[企业版构建]
C --> D[Linux x64 引擎]
C --> E[浏览器自动化]
C --> F[完整路由]
D --> G[Enterprise Release Asset]
E --> G
F --> G
G --> H[GitHub Releases]
H --> I[@frumu/tandem-engine npm]资料来源:src-tauri/src/sidecar_manager.rs - ENGINE_REPO
Sidecar 版本管理
企业版自动管理 Sidecar 二进制版本:
| 配置参数 | 说明 | 默认值 |
|---|---|---|
RELEASES_PER_PAGE | 每页发布版本数 | 20 |
MAX_RELEASE_PAGES | 最大页数 | 5 |
RELEASE_CHECK_INTERVAL_SECS | 检查间隔 | 6 * 60 * 60 (6小时) |
RELEASE_REQUEST_TIMEOUT_SECS | 请求超时 | 8 秒 |
MIN_BINARY_SIZE | 最小二进制大小 | 100KB |
资料来源:src-tauri/src/sidecar_manager.rs
许可与开放核心
Tandem 采用开放核心许可证模式:
| 组件 | 许可证 | 可用性 |
|---|---|---|
| 运行时、协议、SDK | MIT / Apache-2.0 | 开源 |
任务编译器 (tandem-plan-compiler) | BUSL-1.1 | 源可用 |
治理引擎 (tandem-governance-engine) | BUSL-1.1 | 源可用 |
| Tandem 桌面应用 | MIT / Apache-2.0 | 开源 |
资料来源:README.md - 许可 和 docs/LICENSING.md
快速开始
企业托管部署
# 1. 安装 Tandem 企业工具链
npm i -g @frumu/tandem
# 2. 初始化控制面板
tandem install panel
tandem panel init
# 3. 生成 API Token
tandem-engine token generate
# 4. 配置环境变量
export TANDEM_API_TOKEN="your-token-here"
# 5. 启动引擎
tandem-engine serve --hostname 0.0.0.0 --port 39731
资料来源:packages/tandem-control-panel/README.md
本地控制面板
# 生成可编辑的控制面板
npm create tandem-panel@latest my-enterprise-panel
cd my-enterprise-panel
npm install
npm run dev
资料来源:README.md - 可编辑应用脚手架
常见问题与故障排除
Sidecar 未找到
错误: browser_sidecar_not_found
建议:
- 安装 tandem-browser: npm i -g @frumu/tandem-browser
- 或设置环境变量: TANDEM_BROWSER_SIDECAR
- 或配置: browser.sidecar_path
资料来源:crates/tandem-server/src/browser_parts/part02.rs
引擎连接失败
| 检查项 | 命令 | 解决方案 | |
|---|---|---|---|
| 服务状态 | tandem-engine status | 启动引擎服务 | |
| 端口占用 | `netstat -an \ | grep 39731` | 更换端口或释放端口 |
| Token 验证 | 检查 $TANDEM_API_TOKEN | 重新生成 Token | |
| 防火墙 | 测试本地连接 | 开放必要端口 |
资料来源:engine/src/main.rs - STATUS_EXAMPLES
延伸阅读
| 文档 | 描述 |
|---|---|
| 架构概览 | Tandem 系统架构详解 |
| 引擎 CLI 参考 | tandem-engine 命令行完整参考 |
| 引擎通信契约 | 桌面/运行时通信协议 |
| MCP 集成 | MCP 工具连接配置 |
| 安全威胁模型 | 完整安全模型与报告流程 |
| 文档门户 | 官方文档中心 |
来源:https://github.com/frumu-ai/tandem / 项目说明书
失败模式与踩坑日记
保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。
可能阻塞安装或首次运行。
可能阻塞安装或首次运行。
可能增加新用户试用和生产接入成本。
可能增加新用户试用和生产接入成本。
Pitfall Log / 踩坑日志
项目:frumu-ai/tandem
摘要:发现 22 个潜在踩坑项,其中 0 个为 high/blocking;最高优先级:安装坑 - 来源证据:Workflow automation-v2-e42950f5-9d9e-483c-a8da-3d568f98dd46 failed at research_sources: automation run blocked by upstr…。
1. 安装坑 · 来源证据:Workflow automation-v2-e42950f5-9d9e-483c-a8da-3d568f98dd46 failed at research_sources: automation run blocked by upstr…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:Workflow automation-v2-e42950f5-9d9e-483c-a8da-3d568f98dd46 failed at research_sources: automation run blocked by upstream node outcome
- 对用户的影响:可能阻塞安装或首次运行。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_d7998fa92e2f4cae91e7040b71c38bf9 | https://github.com/frumu-ai/tandem/issues/38 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
2. 配置坑 · 来源证据:Workflow automation-v2-1f391975-681a-4041-94b5-8845dfe3307b failed at execute_goal: automation run blocked by upstream…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Workflow automation-v2-1f391975-681a-4041-94b5-8845dfe3307b failed at execute_goal: automation run blocked by upstream node outcome
- 对用户的影响:可能阻塞安装或首次运行。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_b3856a6aadb944f0977020d9841025a5 | https://github.com/frumu-ai/tandem/issues/28 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
3. 配置坑 · 来源证据:Workflow automation-v2-65662b51-ab4e-4348-8349-ea10e7b634c6 failed at synthesize_report: automation run failed from nod…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Workflow automation-v2-65662b51-ab4e-4348-8349-ea10e7b634c6 failed at synthesize_report: automation run failed from node outcomes: synthesize_report
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_8c10aeb4b1874bf39ce9347480864a20 | https://github.com/frumu-ai/tandem/issues/1396 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
4. 配置坑 · 来源证据:Workflow automation-v2-7a7374b2-16bc-416d-bc38-81edb5be7050 failed at assess: automation run failed from node outcomes:…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Workflow automation-v2-7a7374b2-16bc-416d-bc38-81edb5be7050 failed at assess: automation run failed from node outcomes: assess
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_8fda7ba929c344aa863117d5164cb1e5 | https://github.com/frumu-ai/tandem/issues/32 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
5. 配置坑 · 来源证据:Workflow automation-v2-9ee33834-bf6d-4f86-acb3-3cd41d9cef19 failed at assess_reddit_activity: automation run blocked by…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Workflow automation-v2-9ee33834-bf6d-4f86-acb3-3cd41d9cef19 failed at assess_reddit_activity: automation run blocked by upstream node outcome
- 对用户的影响:可能阻塞安装或首次运行。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_55cc9e60475944d78cd5af4305d0f1ef | https://github.com/frumu-ai/tandem/issues/35 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
6. 配置坑 · 来源证据:Workflow automation-v2-9ee33834-bf6d-4f86-acb3-3cd41d9cef19 failed at search_agents_keep: automation node `search_agent…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Workflow automation-v2-9ee33834-bf6d-4f86-acb3-3cd41d9cef19 failed at search_agents_keep: automation node
search_agents_keeptimed out after 180000 ms - 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_fd1ae3d40b5d4c97b8e86767f85466b4 | https://github.com/frumu-ai/tandem/issues/40 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
7. 配置坑 · 来源证据:Workflow automation-v2-9ee33834-bf6d-4f86-acb3-3cd41d9cef19 failed at search_multi_agent: automation node `search_multi…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Workflow automation-v2-9ee33834-bf6d-4f86-acb3-3cd41d9cef19 failed at search_multi_agent: automation node
search_multi_agenttimed out after 180000 ms - 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_9f60d02de0544ffcbacc2c984db5ccaf | https://github.com/frumu-ai/tandem/issues/36 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
8. 配置坑 · 来源证据:Workflow automation-v2-a776164f-06ef-440d-af54-748186205aef failed at analyze_findings: provider stream chunk error: er…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Workflow automation-v2-a776164f-06ef-440d-af54-748186205aef failed at analyze_findings: provider stream chunk error: error decoding response body
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_7f64d78b216242bd8b6108520a197aff | https://github.com/frumu-ai/tandem/issues/49 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
9. 配置坑 · 来源证据:Workflow automation-v2-a776164f-06ef-440d-af54-748186205aef failed at research_sources: automation run blocked by upstr…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Workflow automation-v2-a776164f-06ef-440d-af54-748186205aef failed at research_sources: automation run blocked by upstream node outcome
- 对用户的影响:可能阻塞安装或首次运行。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_bb5c682d661c42d7b568ae17b9e8e0f9 | https://github.com/frumu-ai/tandem/issues/41 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
10. 配置坑 · 来源证据:Workflow automation-v2-b2d6ef35-c222-4027-9251-40adca379cf3 failed at collect_recent_files: required output `.tandem/ru…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Workflow automation-v2-b2d6ef35-c222-4027-9251-40adca379cf3 failed at collect_recent_files: required output `.tandem/runs/automation-v2-run-593051dc-78bf-4927-…
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_fed96ae76b684a42b4e5a90f3f421837 | https://github.com/frumu-ai/tandem/issues/34 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
11. 配置坑 · 来源证据:Workflow automation-v2-bba896a6-0036-4d7a-981f-be803affaa78 failed at assess_tmp_git_repositories: automation run block…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Workflow automation-v2-bba896a6-0036-4d7a-981f-be803affaa78 failed at assess_tmp_git_repositories: automation run blocked by upstream node outcome
- 对用户的影响:可能阻塞安装或首次运行。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_ae2338d77fe04260af3a7dbdae5c45df | https://github.com/frumu-ai/tandem/issues/31 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
12. 配置坑 · 来源证据:Workflow automation-v2-e42950f5-9d9e-483c-a8da-3d568f98dd46 failed at analyze_findings: required output `.tandem/runs/a…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Workflow automation-v2-e42950f5-9d9e-483c-a8da-3d568f98dd46 failed at analyze_findings: required output `.tandem/runs/automation-v2-run-6f7ba9ed-df91-4261-9271…
- 对用户的影响:可能阻塞安装或首次运行。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_9e491d1989bf4812be296a05d006b876 | https://github.com/frumu-ai/tandem/issues/1336 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
13. 能力坑 · 能力判断依赖假设
- 严重度:medium
- 证据强度:source_linked
- 发现:README/documentation is current enough for a first validation pass.
- 对用户的影响:假设不成立时,用户拿不到承诺的能力。
- 建议检查:将假设转成下游验证清单。
- 防护动作:假设必须转成验证项;没有验证结果前不能写成事实。
- 证据:capability.assumptions | mcp_registry:ac.tandem/docs-mcp:0.3.2 | https://registry.modelcontextprotocol.io/v0.1/servers/ac.tandem%2Fdocs-mcp/versions/0.3.2 | README/documentation is current enough for a first validation pass.
14. 运行坑 · 来源证据:Workflow automation-v2-0af90431-6b5e-40fd-8b9d-7b982770a851 failed at automation_v2: automation run paused after no pro…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个运行相关的待验证问题:Workflow automation-v2-0af90431-6b5e-40fd-8b9d-7b982770a851 failed at automation_v2: automation run paused after no provider activity for at least 300s
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_add4a18d3c9845a387fb3dc35428ae3a | https://github.com/frumu-ai/tandem/issues/30 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
15. 运行坑 · 来源证据:Workflow automation-v2-9ee33834-bf6d-4f86-acb3-3cd41d9cef19 failed at automation_v2: automation run paused after no pro…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个运行相关的待验证问题:Workflow automation-v2-9ee33834-bf6d-4f86-acb3-3cd41d9cef19 failed at automation_v2: automation run paused after no provider activity for at least 300s
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_a823ae57304c43e1b6a6ff27911e34dc | https://github.com/frumu-ai/tandem/issues/29 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
16. 运行坑 · 来源证据:Workflow automation-v2-ac727d53-7f94-4c8d-935e-5d615fe5db38 failed at automation_v2: automation run paused after no pro…
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个运行相关的待验证问题:Workflow automation-v2-ac727d53-7f94-4c8d-935e-5d615fe5db38 failed at automation_v2: automation run paused after no provider activity for at least 300s
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_e0012b3de456436babf130e167def424 | https://github.com/frumu-ai/tandem/issues/33 | 来源讨论提到 node 相关条件,需在安装/试用前复核。
17. 维护坑 · 维护活跃度未知
- 严重度:medium
- 证据强度:source_linked
- 发现:未记录 last_activity_observed。
- 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
- 建议检查:补 GitHub 最近 commit、release、issue/PR 响应信号。
- 防护动作:维护活跃度未知时,推荐强度不能标为高信任。
- 证据:evidence.maintainer_signals | mcp_registry:ac.tandem/docs-mcp:0.3.2 | https://registry.modelcontextprotocol.io/v0.1/servers/ac.tandem%2Fdocs-mcp/versions/0.3.2 | last_activity_observed missing
18. 安全/权限坑 · 下游验证发现风险项
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 对用户的影响:下游已经要求复核,不能在页面中弱化。
- 建议检查:进入安全/权限治理复核队列。
- 防护动作:下游风险存在时必须保持 review/recommendation 降级。
- 证据:downstream_validation.risk_items | mcp_registry:ac.tandem/docs-mcp:0.3.2 | https://registry.modelcontextprotocol.io/v0.1/servers/ac.tandem%2Fdocs-mcp/versions/0.3.2 | no_demo; severity=medium
19. 安全/权限坑 · 存在评分风险
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 对用户的影响:风险会影响是否适合普通用户安装。
- 建议检查:把风险写入边界卡,并确认是否需要人工复核。
- 防护动作:评分风险必须进入边界卡,不能只作为内部分数。
- 证据:risks.scoring_risks | mcp_registry:ac.tandem/docs-mcp:0.3.2 | https://registry.modelcontextprotocol.io/v0.1/servers/ac.tandem%2Fdocs-mcp/versions/0.3.2 | no_demo; severity=medium
20. 安全/权限坑 · 来源证据:[ACA Slice Parent] Phase 2 - Isolate runtime execution, secrets, artifacts, and streams
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:[ACA Slice Parent] Phase 2 - Isolate runtime execution, secrets, artifacts, and streams
- 对用户的影响:可能影响授权、密钥配置或安全边界。
- 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
- 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
- 证据:community_evidence:github | cevd_3ad20ab8b4cf40c7af6095e044e19fcb | https://github.com/frumu-ai/tandem/issues/1442 | 来源类型 github_issue 暴露的待验证使用条件。
21. 维护坑 · issue/PR 响应质量未知
- 严重度:low
- 证据强度:source_linked
- 发现:issue_or_pr_quality=unknown。
- 对用户的影响:用户无法判断遇到问题后是否有人维护。
- 建议检查:抽样最近 issue/PR,判断是否长期无人处理。
- 防护动作:issue/PR 响应未知时,必须提示维护风险。
- 证据:evidence.maintainer_signals | mcp_registry:ac.tandem/docs-mcp:0.3.2 | https://registry.modelcontextprotocol.io/v0.1/servers/ac.tandem%2Fdocs-mcp/versions/0.3.2 | issue_or_pr_quality=unknown
22. 维护坑 · 发布节奏不明确
- 严重度:low
- 证据强度:source_linked
- 发现:release_recency=unknown。
- 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
- 建议检查:确认最近 release/tag 和 README 安装命令是否一致。
- 防护动作:发布节奏未知或过期时,安装说明必须标注可能漂移。
- 证据:evidence.maintainer_signals | mcp_registry:ac.tandem/docs-mcp:0.3.2 | https://registry.modelcontextprotocol.io/v0.1/servers/ac.tandem%2Fdocs-mcp/versions/0.3.2 | release_recency=unknown
来源:Doramagic 发现、验证与编译记录