Skip to content

常见问题

安装

系统要求是什么?

Triggerfish 可在 macOS(Intel 和 Apple Silicon)、Linux(x64 和 arm64)以及 Windows(x64)上运行。二进制安装程序会处理所有依赖。如果从源码构建,需要 Deno 2.x。

对于 Docker 部署,任何运行 Docker 或 Podman 的系统均可使用。容器镜像基于 distroless Debian 12。

Triggerfish 将数据存储在哪里?

默认情况下,所有数据存放在 ~/.triggerfish/ 目录下:

~/.triggerfish/
  triggerfish.yaml          # 配置文件
  SPINE.md                  # Agent 身份文件
  TRIGGER.md                # 主动行为定义
  logs/                     # 日志文件(1 MB 轮转,保留 10 个备份)
  data/triggerfish.db       # SQLite 数据库(会话、记忆、状态)
  skills/                   # 已安装的技能
  backups/                  # 带时间戳的配置备份

Docker 部署使用 /data 代替。您可以通过 TRIGGERFISH_DATA_DIR 环境变量覆盖基础目录。

可以移动数据目录吗?

可以。在启动守护进程之前,将 TRIGGERFISH_DATA_DIR 环境变量设置为您期望的路径。如果使用 systemd 或 launchd,需要更新服务定义(参见平台说明)。

安装程序提示无法写入 /usr/local/bin

安装程序首先尝试 /usr/local/bin。如果需要 root 权限,会回退到 ~/.local/bin。如果需要系统级安装,请使用 sudo 重新运行:

bash
curl -sSL https://raw.githubusercontent.com/greghavens/triggerfish/master/scripts/install.sh | sudo bash

如何卸载 Triggerfish?

bash
# Linux / macOS
curl -sSL https://raw.githubusercontent.com/greghavens/triggerfish/master/scripts/uninstall.sh | bash

这将停止守护进程、移除服务定义(systemd unit 或 launchd plist)、删除二进制文件,并移除整个 ~/.triggerfish/ 目录及其所有数据。


配置

如何更改 LLM 提供商?

编辑 triggerfish.yaml 或使用 CLI:

bash
triggerfish config set models.primary.provider anthropic
triggerfish config set models.primary.model claude-sonnet-4-20250514

守护进程会在配置更改后自动重启。

API 密钥存储在哪里?

API 密钥存储在操作系统密钥链中(macOS Keychain、Linux Secret Service 或 Windows/Docker 上的加密文件)。切勿将原始 API 密钥放入 triggerfish.yaml。请使用 secret: 引用语法:

yaml
models:
  providers:
    anthropic:
      model: claude-sonnet-4-20250514
      apiKey: "secret:provider:anthropic:apiKey"

存储实际密钥:

bash
triggerfish config set-secret provider:anthropic:apiKey sk-ant-...

配置中的 secret: 是什么意思?

secret: 为前缀的值是对操作系统密钥链的引用。在启动时,Triggerfish 会解析每个引用并在内存中替换为实际的密钥值。原始密钥永远不会出现在磁盘上的 triggerfish.yaml 中。有关各平台后端的详细信息,请参阅密钥与凭证

什么是 SPINE.md?

SPINE.md 是您的 Agent 身份文件。它定义了 Agent 的名称、使命、个性和行为准则。可以将其视为系统提示词的基础。安装向导(triggerfish dive)会为您生成一个,但您可以自由编辑。

什么是 TRIGGER.md?

TRIGGER.md 定义了您的 Agent 的主动行为:在计划的触发器唤醒期间应该检查、监控和执行什么。如果没有 TRIGGER.md,触发器仍会触发,但 Agent 将没有执行指令。

如何添加新通道?

bash
triggerfish config add-channel telegram

这会启动一个交互式提示,引导您完成所需字段的填写(Bot Token、Owner ID、分类级别)。您也可以直接编辑 triggerfish.yaml 中的 channels: 部分。

我修改了配置但没有生效

守护进程必须重启才能应用更改。如果使用 triggerfish config set,它会提示自动重启。如果手动编辑了 YAML 文件,请使用以下命令重启:

bash
triggerfish stop && triggerfish start

通道

为什么我的 Bot 不响应消息?

首先检查:

  1. 守护进程是否在运行? 执行 triggerfish status
  2. 通道是否已连接? 检查日志:triggerfish logs
  3. Bot Token 是否有效? 大多数通道在 Token 无效时会静默失败
  4. Owner ID 是否正确? 如果您未被识别为所有者,Bot 可能会限制响应

有关特定通道的检查清单,请参阅通道故障排除指南。

什么是 Owner ID?为什么它很重要?

Owner ID 告诉 Triggerfish 在给定通道上哪个用户是您(操作者)。非所有者用户的工具访问权限受限,并且可能受到分类限制。如果 Owner ID 留空,行为因通道而异。某些通道(如 WhatsApp)会将所有人视为所有者,这存在安全风险。

可以同时使用多个通道吗?

可以。在 triggerfish.yaml 中配置任意数量的通道。每个通道维护自己的会话和分类级别。路由器处理所有已连接通道之间的消息分发。

消息大小限制是什么?

通道限制行为
Telegram4,096 字符自动分块
Discord2,000 字符自动分块
Slack40,000 字符截断(不分块)
WhatsApp4,096 字符截断
Email无硬性限制发送完整消息
WebChat无硬性限制发送完整消息

为什么 Slack 消息会被截断?

Slack 有 40,000 字符的限制。与 Telegram 和 Discord 不同,Triggerfish 会截断 Slack 消息而不是将其拆分为多条消息。非常长的响应(如大段代码输出)可能会丢失末尾内容。


安全与分类

分类级别有哪些?

四个级别,从最低到最高敏感度:

  1. PUBLIC - 数据流无限制
  2. INTERNAL - 标准运营数据
  3. CONFIDENTIAL - 敏感数据(凭证、个人信息、财务记录)
  4. RESTRICTED - 最高敏感度(受监管数据、合规关键数据)

数据只能从低级别流向相同或更高级别。CONFIDENTIAL 数据永远不能到达 PUBLIC 通道。这就是"禁止写入降级"规则,且不可覆盖。

"会话污染"是什么意思?

每个会话从 PUBLIC 开始。当 Agent 访问分类数据(读取 CONFIDENTIAL 文件、查询 RESTRICTED 数据库)时,会话污染会升级以匹配。污染只升不降。被污染为 CONFIDENTIAL 的会话无法将其输出发送到 PUBLIC 通道。

为什么我收到"写入降级被阻止"的错误?

您的会话已被污染到高于目标的分类级别。例如,如果您访问了 CONFIDENTIAL 数据然后尝试将结果发送到 PUBLIC WebChat 通道,策略引擎会阻止此操作。

这是预期行为。要解决此问题,您可以:

  • 开始新会话(新的对话)
  • 使用分类级别等于或高于会话污染级别的通道

可以禁用分类执行吗?

不可以。分类系统是核心安全不变量。它作为确定性代码在 LLM 层之下运行,无法被绕过、禁用或被 Agent 影响。这是设计使然。


LLM 提供商

支持哪些提供商?

Anthropic、OpenAI、Google Gemini、Fireworks、OpenRouter、ZenMux、Z.AI,以及通过 Ollama 或 LM Studio 使用的本地模型。

故障转移如何工作?

triggerfish.yaml 中配置 failover 列表:

yaml
models:
  primary:
    provider: anthropic
    model: claude-sonnet-4-20250514
  failover:
    - openai/gpt-4o
    - google/gemini-2.5-pro

如果主要提供商失败,Triggerfish 会按顺序尝试每个备选方案。failover_config 部分控制重试次数、延迟和触发故障转移的错误条件。

我的提供商返回 401 / 403 错误

您的 API 密钥无效或已过期。重新存储:

bash
triggerfish config set-secret provider:<name>:apiKey <your-key>

然后重启守护进程。有关特定提供商的指导,请参阅 LLM 提供商故障排除

可以为不同分类级别使用不同模型吗?

可以。使用 classification_models 配置:

yaml
models:
  classification_models:
    RESTRICTED:
      provider: local
      model: llama-3.3-70b
    CONFIDENTIAL:
      provider: anthropic
      model: claude-sonnet-4-20250514

被污染到特定级别的会话将使用相应的模型。没有显式覆盖的级别会回退到主要模型。


Docker

如何在 Docker 中运行 Triggerfish?

bash
curl -sSL https://raw.githubusercontent.com/greghavens/triggerfish/master/deploy/docker/install.sh | bash

这将下载 Docker 包装脚本和 compose 文件,拉取镜像并运行安装向导。

Docker 中数据存储在哪里?

所有持久化数据存储在 Docker 命名卷(triggerfish-data)中,挂载在容器内的 /data 路径。包括配置、密钥、SQLite 数据库、日志、技能和 Agent 工作区。

Docker 中密钥如何工作?

Docker 容器无法访问宿主机操作系统的密钥链。Triggerfish 使用加密文件存储代替:secrets.json(加密值)和 secrets.key(AES-256 加密密钥),均存储在 /data 卷中。请将该卷视为敏感数据。

容器找不到我的配置文件

确保正确挂载:

bash
docker run -v ./triggerfish.yaml:/data/triggerfish.yaml ...

如果容器在没有配置文件的情况下启动,将打印帮助信息并退出。

如何更新 Docker 镜像?

bash
triggerfish update    # 如果使用包装脚本
# 或
docker compose pull && docker compose up -d

技能与 The Reef

什么是技能?

技能是一个包含 SKILL.md 文件的文件夹,为 Agent 提供新的能力、上下文或行为准则。技能可以包含工具定义、代码、模板和指令。

什么是 The Reef?

The Reef 是 Triggerfish 的技能市场。您可以通过它发现、安装和发布技能:

bash
triggerfish skill search "web scraping"
triggerfish skill install reef://data-extraction

为什么我的技能被安全扫描器阻止了?

每个技能在安装前都会被扫描。扫描器检查可疑模式、过多权限和分类上限违规。如果技能的上限低于您当前的会话污染级别,激活将被阻止以防止写入降级。

技能的分类上限是什么?

技能声明了允许操作的最大分类级别。classification_ceiling: INTERNAL 的技能不能在被污染为 CONFIDENTIAL 或更高级别的会话中激活。这防止技能访问超出其权限的数据。


触发器与调度

什么是触发器?

触发器是用于主动行为的定期 Agent 唤醒。您在 TRIGGER.md 中定义 Agent 应该检查的内容,Triggerfish 按计划唤醒它。Agent 审查其指令,采取行动(检查日历、监控服务、发送提醒),然后回到休眠状态。

触发器与 Cron 作业有什么不同?

Cron 作业按计划运行固定任务。触发器唤醒 Agent 并提供完整上下文(记忆、工具、通道访问权限),让它根据 TRIGGER.md 的指令决定要做什么。Cron 是机械式的;触发器是智能代理式的。

什么是静默时段?

scheduler.trigger 中的 quiet_hours 设置可防止触发器在指定时段内触发:

yaml
scheduler:
  trigger:
    interval: "30m"
    quiet_hours: "22:00-07:00"

Webhook 如何工作?

外部服务可以向 Triggerfish 的 Webhook 端点发送 POST 请求以触发 Agent 操作。每个 Webhook 源需要 HMAC 签名进行身份验证,并包含重放检测。


Agent 团队

什么是 Agent 团队?

Agent 团队是持久的协作 Agent 组,它们共同处理复杂任务。每个团队成员是一个独立的 Agent 会话,拥有自己的角色、对话上下文和工具。其中一个成员被指定为负责人并协调工作。有关完整文档,请参阅 Agent 团队

团队与子 Agent 有什么不同?

子 Agent 是即发即忘型的:您委派一个任务然后等待结果。团队是持久的——成员通过 sessions_send 相互通信,负责人协调工作,团队自主运行直到被解散或超时。对于专注的委派任务使用子 Agent;对于复杂的多角色协作使用团队。

Agent 团队需要付费计划吗?

使用 Triggerfish Gateway 时,Agent 团队需要 Power 计划($149/月)。使用自己 API 密钥的开源用户拥有完全访问权限——每个团队成员从您配置的 LLM 提供商消耗推理资源。

为什么我的团队负责人立即失败了?

最常见的原因是 LLM 提供商配置错误。每个团队成员都会生成自己的 Agent 会话,需要一个可用的 LLM 连接。在创建团队时,检查 triggerfish logs 中的提供商错误。有关更多详情,请参阅 Agent 团队故障排除

团队成员可以使用不同的模型吗?

可以。每个成员定义接受可选的 model 字段。如果省略,成员继承创建 Agent 的模型。这允许您为复杂角色分配昂贵的模型,为简单角色分配便宜的模型。

团队可以运行多长时间?

默认情况下,团队的生命周期为 1 小时(max_lifetime_seconds: 3600)。达到限制时,负责人会获得 60 秒警告以生成最终输出,然后团队会自动解散。您可以在创建时配置更长的生命周期。

如果团队成员崩溃会怎样?

生命周期监控器在 30 秒内检测到成员故障。失败的成员被标记为 failed,负责人被通知继续使用剩余成员或解散团队。如果负责人本身失败,团队会暂停,创建会话的用户会收到通知。


其他

Triggerfish 是开源的吗?

是的,采用 Apache 2.0 许可证。完整源代码(包括所有安全关键组件)可在 GitHub 上进行审计。

Triggerfish 会向外发送数据吗?

不会。Triggerfish 除了您明确配置的服务(LLM 提供商、通道 API、集成)外,不会建立任何出站连接。没有遥测、分析或更新检查,除非您运行 triggerfish update

可以运行多个 Agent 吗?

可以。agents 配置部分定义了多个 Agent,每个都有自己的名称、模型、通道绑定、工具集和分类上限。路由系统将消息定向到适当的 Agent。

什么是 Gateway?

Gateway 是 Triggerfish 的内部 WebSocket 控制平面。它管理会话、在通道和 Agent 之间路由消息、分发工具并执行策略。CLI 聊天界面连接到 Gateway 与您的 Agent 通信。

Triggerfish 使用哪些端口?

端口用途绑定
18789Gateway WebSocket仅限 localhost
18790Tidepool A2UI仅限 localhost
8765WebChat(启用时)可配置
8443WhatsApp Webhook(启用时)可配置

所有默认端口绑定到 localhost。除非您明确配置或使用反向代理,否则不会暴露到网络。