跳到主要内容

频道和语音

Anda 可以只待在终端里,也可以接入团队频道。频道会把上下文带回同一套运行时和记忆系统。

支持的频道​

  • Telegram
  • WeChat
  • Discord
  • Lark / 飞书

频道配置位于 ~/.anda/config.yaml 的 channels 下。

多用户​

一个 daemon 可以让多个可信用户通过同一个 Anda agent 接入。先创建用户 key,再在 channel 条目的 user 中引用该 id。未配置 user 时,该 channel 使用操作系统安全凭证库里的本地 owner 身份。daemon 管理操作(修改配置、重载与切换模型、安装更新、关停)仍只允许本地 owner 执行。

anda user create alice
anda user list

命令会把新用户的公钥写入顶层 users,并把匹配的私钥保存到 ~/.anda/credentials/ 下的本地加密凭证库。凭证文件里是加密的 COSE Key,加密密钥从本地 daemon 身份密钥派生。如果明确需要文件 key,请使用下面的 anda user export。

在 Linux 上,如果没有可用或已解锁的 Secret Service provider,Anda 可以读取已有的 daemon/owner 私钥文件 ~/.anda/keys/anda_bot.key 和 ~/.anda/keys/user.key,并在终端和日志中显示提醒。两个文件必须完整存在:凭据库不可用时不会生成替代身份。已有安装应解锁 provider 或恢复原始密钥;可信用户私钥仍使用从原始 daemon 身份派生的密钥加密保存。

对于没有操作系统凭据库的全新安装,请先显式运行 anda user init-file-keys,再运行 anda start。该命令创建缺失的私钥文件,不覆盖已有文件;若已有本地数据库/凭据数据,或能读取到 keyring 中的身份,则拒绝初始化。不要用它恢复已有安装。导入的 COSE 密钥必须标明 Ed25519 曲线;算法字段存在时必须为 EdDSA,私钥附带的公钥必须与其匹配。原始 32 字节 Base64 密钥继续受支持。

若要使用 Secret Service,请在用户 D-Bus session 中启动并解锁 provider,例如运行 gnome-keyring-daemon --start --components=secrets,确认 Anda 能拿到 DBUS_SESSION_BUS_ADDRESS,然后重启;KDE 用户也可以解锁 KWallet。已有文件身份会一起迁移到一个 keyring bundle,只有完整保存成功后才删除源文件。

如果需要把已有身份私钥导出到文件,使用 anda user export。身份可以是 daemon、owner、default 或可信用户 id:

anda user export daemon --key-path ./anda-daemon.key
anda user export owner --key-path ./anda-owner.key
anda user export alice --key-path ./alice.key

导出的私钥文件不要放进代码仓库或共享目录。

配置仍是这样:

users:
- id: alice
pubkey: "ALICE_ED25519_PUBLIC_KEY"
- id: ops
pubkey: "OPS_ED25519_PUBLIC_KEY"

Telegram 示例​

channels:
telegram:
- id: personal
user: alice
bot_token: "YOUR_TELEGRAM_BOT_TOKEN"
username: "YOUR_TELEGRAM_BOT_USERNAME"
allowed_users:
- "*"
mention_only: false

WeChat 示例​

channels:
wechat:
- id: personal
user: alice
# 留空时,可以运行 anda channel init wechat,扫码登录并获得 token。
bot_token: ""
username: anda-wechat
allowed_users:
- "*"

Discord 示例​

Discord 使用 bot token 和 Gateway 连接。先创建并安装 bot,再改 config.yaml:

  1. 打开 Discord Developer Portal,创建或打开你的 app。
  2. 在 app 的 Bot 页面复制或重置 bot token。同时在 Privileged Gateway Intents 下打开 Message Content Intent,这样 Anda 才能读取普通消息正文。
  3. 在 Installation 页面,让 Guild Install 包含 bot scope。没有 bot scope 时,app 可能会出现在 Discord Apps 里,但不会作为服务器 bot 成员出现。
  4. 至少授予 View Channels、Send Messages 和 Read Message History。如果要让 Anda 发送文件,加 Attach Files;如果 ack_reactions: true,加 Add Reactions。
  5. 把 app 安装到你的服务器。服务器安装成功后,bot 应该会出现在服务器成员列表里。
channels:
discord:
- id: server
user: ops
bot_token: "YOUR_DISCORD_BOT_TOKEN"
username: anda-discord
# 可选。限制这个条目只处理一个 Discord 服务器。
guild_id: "YOUR_DISCORD_GUILD_ID"
allowed_users:
- "YOUR_DISCORD_USER_ID"
mention_only: true
ack_reactions: true

配置校验层面只有 bot_token 是必填。为了实际可用并更安全,建议把 allowed_users 设为 Discord 用户 ID;当 allowed_users 为空且 allow_external_users: false 时,非 allowlist 发送者会被忽略。只有确实要让不可信外部用户以 $external_user 身份对话时,才设置 allow_external_users: true。

保存配置后运行:

anda channel list
anda restart

在服务器频道里,@ 这个 bot:

@anda-discord 总结一下这个讨论

在 bot 私信里,直接发送普通消息即可,不需要 @。如果看不到 bot,先确认 Guild Install 包含 bot scope,并确认 daemon 正在运行。

Lark / 飞书示例​

channels:
lark:
- id: work
user: ops
app_id: "cli_xxx"
app_secret: "YOUR_APP_SECRET"
platform: feishu
receive_mode: websocket
mention_only: true

频道安全检查​

  • allowed_users 决定谁能触发 Anda;只有可接受开放访问时才使用 "*"。
  • user 决定这个 channel 条目的会话、资源和记忆由哪个可信 Anda caller 拥有。
  • Telegram 和 Discord 通常需要 bot_token。
  • WeChat 可以使用已保存 token,也可以在 bot_token 为空时走扫码登录。
  • Lark / 飞书需要 app_id 和 app_secret;飞书端点使用 platform: feishu。
  • 频道路由会被持久化,方便后续回复回到原线程、房间或联系人。

消息投递​

https_proxy 同时用于频道 API 请求、媒体传输以及 Discord/Lark WebSocket 连接;微信不需要代理,不经过它。Discord 会恢复可恢复的会话并检查心跳确认,附件下载独立进行。

使用 list_im_channels 查找最近的收件人和线程。它扫描最新 300 条已存储消息,并区分不同线程。send_im_message 的 thread 分别使用 Telegram topic ID、Discord 线程频道 ID,或 Lark/飞书根消息 ID(om_...)。Telegram 仍兼容 chat_id:topic_id 收件人格式;显式 thread 优先。

文本分段和附件分别重试。后续部分失败时不会重发已成功投递的部分,历史记录写入失败也不会触发重发。部分投递后的失败会被报告,不会整条回放。对于无法确定是否已投递的传输超时,不会自动重复提交。

只有附件的回复也会投递。Lark/飞书把 HTTP(S) 附件作为卡片中的链接,本地文件和二进制附件则上传后以图片或文件消息发送(图片不超过 10 MB,文件不超过 30 MB)。接收端支持用户图片,以及直接结构或带语言包装的富文本消息。Anda 拒绝可信用户的消息时(例如 /goal 缺少内容),会把原因回复到原会话;外部用户不会收到内部细节。

频道历史引用已存入频道工作区的附件;备份数据库时请同时保留其 attachments 目录。微信复用 HTTP 客户端,并将旧 context-token 文件迁移为 context_tokens_v2.json,在同一条记录中保存 token 和更新时间。

语音输入和播放​

语音输入需要配置 transcription.enabled: true。启动一次语音会话:

anda voice --record-secs 8

如果还希望 Anda 播放回答,需要配置 tts.enabled: true。只需要麦克风输入和文字输出时:

anda voice --record-secs 8 --no-playback

音频附件也可以在转写启用后进入上下文,这让频道里的语音消息可以成为同一条记忆线索的一部分。