介绍

公众号刷到一篇关于 Horizon 在飞牛 Nas 上部署的文章,看到有用到 AI,正好 deepseek API 充了 10 块钱,前面本地 Claude Code 配置失败用不了,终于有地方能试试了。

Horizon 通过从支持的信息源抓取内容,合并去除重复新闻,用 AI 打分过滤,最后补充背景知识。AI 主要参与的环节在后半段,整理完成后会生成一个 md 文件,并且可以通过一些方式途径(邮件订阅、Webhook 通知等)发布。

Thysrael/Horizon 源码主体部分是 python,支持 docker 方式安装运行。因为 AI 只是使用了 API 调用,不需要安装模型,使用的资源有限,所以选择直接在服务器上安装。

安装、配置

按照官方给的指令,下载脚本,初始化配置。

git clone https://github.com/Thysrael/Horizon.git
cd horizon

# 配置环境
cp .env.example .env
cp data/config.example.json data/config.json
# 编辑 .env 和 data/config.json,填入你的 API 密钥和偏好设置

# 使用 Docker Compose 运行
docker-compose run --rm horizon

# 或自定义时间窗口
docker-compose run --rm horizon --hours 48

运行部分先不管,先看 .envdata/config.json 两个配置文件。.env 里需要配置两项:

# 新增的定义,deepseek 的 API Key
DEEPSEEK_API_KEY=sk-xxx
# 飞书群聊里,自定义机器人的 Webhook 地址
HORIZON_WEBHOOK_URL=https://open.feishu.cn/open-apis/bot/v2/hook/xxx
# 还有一个 GITHUB_TOKEN 可以考虑加,不加也影响不大

data/config.json 里可以在覆盖前复制一下 ai 部分的配置,正好就是面向 deepseek 的配置

  "ai": {
    "provider": "deepseek",
    "model": "deepseek-v4-flash",
    "base_url": "https://api.deepseek.com",
    "api_key_env": "DEEPSEEK_API_KEY",
    "temperature": 0.3,
    "max_tokens": 8192,
    "languages": [
      "zh",
      "en"
    ],
    "analysis_concurrency": 5,
    "enrichment_concurrency": 5
  }

api_key_env 需要与 .env 中 deepsseek 赋值的常量名一致,我这里取新增的 DEEPSEEK_API_KEY

webhook 部分可以保留原样,测试是匹配当前的飞书卡片格式的。

运行

一次性运行,即官方给出的指令:

# docker 没安装 compose 插件,指令不加 -
docker compose run --rm horizon

它会创建容器,然后运行一次完整流程,最后删除掉容器。

尝试过使用 docker compose up -d 也可以正常启动容器,但不清楚轮训还是定时脚本的原因,大概 10 分钟会获取一次,问 chatgpt 也没有找到所谓配置的 schedule 定义。官方推荐是使用 github action 的定时任务来触发,当然也就可以通过系统的 cron 来执行了。

crontab -e
# 修改 Horizon 脚本的实际地址,我是 /root/Horizon
0 9 * * * cd /root/Horizon && docker compose run --rm horizon

问题解决

飞书找不到添加自定义机器人的入口

在群组中使用机器人自定义机器人使用指南

明明有自定义机器人的文档,示例截图中也明确显示有这个入口:群聊 -> 设置 -> 群机器人 -> 添加机器人 -> 自定义机器人,但飞书 web 页面就没有。

问 chatgpt 说企业有,之后证实企业 web 页面也没有,尝试添加带有机器人的应用,移动端可以添加应用,但依然找不到自定义机器人。最后问了飞书客服才知道,仅桌面版支持添加自定义机器人

有点想骂人,然后想确认到底是飞书的文档写得烂,还是我自己漏掉了这一趴。结果在说明找到了这样的:

在内部群中,你可使用桌面端添加应用机器人及自定义机器人,可使用移动端添加应用机器人。
在外部群中,你仅可使用桌面端添加自定义机器人、已开启应用共享能力或对外共享能力的应用机器人;可使用移动端添加已开启对外共享能力的应用机器人。

自己创建的群,不清楚属于内部群还是外部群,但 web 版和移动端就是没有。客服的说法更准确,内部群、外部群都仅桌面版支持添加自定义机器人。飞书真的是卡皮吧啦,功能越做越复杂,一个手机号可以创建那么多个账号,也不知道有什么用。与其加班卷各种功能,不能把文档写好点吗,字体加粗会不会更好一些呢!

镜像拉取卡住

第一次运行会拉取一些构建镜像的文件,一般都会需要花费大几百秒的时间。如果拉取镜像卡住了,可以考虑在 Dockfile 中增加镜像源地址:

ENV UV_DEFAULT_INDEX=https://mirrors.aliyun.com/pypi/simple/
ENV UV_HTTP_TIMEOUT=300

其他的情况只能慢慢等。

降低 token 消耗

可以调整 ai 部分的参数,来降低 token 消耗:

    "max_tokens": 4096,
    "languages": [
        "zh"
    ],
    "throttle_sec": 0,
    "analysis_concurrency": 1,
    "enrichment_concurrency": 1

限制最大的 token 使用数,双语言新闻改为只留中文版本,然后下面两个参数调到最低为 1。

收到的飞书新闻

推的内容不怎么感兴趣,后面有时间再考虑如何调整、配置信息源。

因为网络原因,存在很多无法获取内容的国外信息源。获取的内容太大或太偏,不能精准命中需求。AI 相关的新闻有点泛滥,24 小时 + 6 分以上,让抓取的内容完全变成了看不懂也不感兴趣的样子。

飞书 Horizon 新闻截图

文章目录