频道和语音
Anda 可以只待在终端里,也可以接入团队频道。频道会把上下文带回同一套运行时和记忆系统。
支持的频道
- Telegram
- 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:
- 打开 Discord Developer Portal,创建或打开你的 app。
- 在 app 的 Bot 页面复制或重置 bot token。同时在 Privileged Gateway Intents 下打开 Message Content Intent,这样 Anda 才能读取普通消息正文。
- 在 Installation 页面,让 Guild Install 包含
botscope。没有botscope 时,app 可能会出现在 Discord Apps 里,但不会作为服务器 bot 成员出现。 - 至少授予
View Channels、Send Messages和Read Message History。如果要让 Anda 发送文件,加Attach Files;如果ack_reactions: true,加Add Reactions。 - 把 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
音频附件也可以在转写启用后进入上下文,这让频道里的语音消息可以成为同一条记忆线索的一部分。