21K 行代码实现一个生产级 AI Agent 框架 — CountBot 架构设计与技术解析 | 今日正式开源

21K 行代码实现一个生产级 AI Agent 框架 — CountBot 架构设计与技术解析 | 今日正式开源

CountBot 是一个轻量级、可扩展的 AI Agent 框架,专为中文用户和国内大模型优化。今天(2026.2.21)正式开源。

GitHub:https://github.com/countbot-ai/CountBot

桌面版下载:https://github.com/countbot-ai/CountBot/releases(支持 Windows / macOS / Linux)

在这里插入图片描述

一、项目背景

做 AI Agent 的框架不少,但真正适合个人用户的不多。大多数框架面向企业场景,代码量动辄几十万行,配置复杂,对中文用户和国产大模型的支持也不够友好。

CountBot 的目标很明确:用最少的代码,做一个功能完整、开箱即用、中文优先的个人 AI Agent。

最终成果:约 21,000 行 Python 代码,涵盖了记忆系统、多渠道接入、技能插件、消息队列、安全认证等完整的 Agent 基础设施。


二、架构设计

2.1 整体架构

countbot/ ├── backend/ # 后端核心(~21K 行) │ ├── modules/ │ │ ├── agent/ # Agent 核心(ReAct 循环、记忆、上下文) │ │ ├── messaging/ # 消息队列(优先级调度、令牌桶限流) │ │ ├── cron/ # Cron 调度器(精确按需唤醒) │ │ ├── auth/ # 安全认证(渐进式安全模型) │ │ ├── channels/ # 渠道管理(飞书/钉钉/QQ/Telegram) │ │ ├── providers/ # LLM 提供商(基于 LiteLLM) │ │ └── tools/ # 工具系统(13 个内置工具) ├── frontend/ # 前端(Vue 3 + TypeScript) ├── skills/ # 技能插件(10 种) └── docs/ # 完整文档(11 篇) 

模块化设计,每个模块职责清晰,耦合度低。新增 LLM 提供商、消息渠道、工具或技能,只需在对应目录下添加文件。

2.2 Agent 核心:ReAct 循环

Agent 的核心是一个标准的 ReAct(Reasoning + Acting)循环:

  1. 接收用户消息
  2. 构建上下文(系统提示 + 记忆 + 对话历史 + 工具描述)
  3. 调用 LLM 推理
  4. 如果 LLM 返回工具调用 → 执行工具 → 将结果反馈给 LLM → 继续循环
  5. 如果 LLM 返回文本 → 输出给用户

关键设计:上下文构建时会自动进行滚动压缩,当对话历史超出窗口时,早期对话会被 LLM 总结为摘要,大幅降低 Token 消耗。

2.3 智能记忆系统

这是 CountBot 最核心的差异化特性。记忆系统分为两层:

短期记忆(对话上下文):

  • 滚动窗口内的完整对话
  • 超出窗口时自动压缩为摘要

长期记忆(持久化存储):

  • LLM 自动判断何时需要记忆
  • 通过 memory_write 工具写入
  • 通过 memory_search 关键词检索
  • 行式文件存储,简单可靠
# 记忆系统的工作流程 用户:"我叫张三,住在北京,喜欢吃火锅"# → LLM 判断这是重要信息 → 自动调用 memory_write 存储# 三天后... 用户:"帮我推荐附近的餐厅"# → LLM 自动调用 memory_search("用户偏好") → 检索到"喜欢火锅"# → 结合用户地址"北京" → 推荐北京的火锅店

2.4 渐进式安全模型

这个设计我个人比较满意。核心思路是:安全等级随访问距离递增。

  • 本地访问(127.0.0.1):零摩擦,直接使用。个人电脑上用,没必要每次输密码。
  • 远程访问(192.168.x.x):首次访问自动引导设置密码,后续需要登录。

API 密钥使用 Fernet 对称加密存储在 SQLite 中,运行时自动解密。命令执行有沙箱保护,包括工作空间隔离、路径穿越检测、空字节注入阻断。

2.5 Cron 调度器:精确按需唤醒

没有用传统的每秒轮询方式,而是计算所有启用任务的下次执行时间,取最近的一个,精确 sleep 到那个时刻:

next_wake =min([job.next_run for job in enabled_jobs])await asyncio.sleep((next_wake - now).total_seconds())

配合信号量控制并发、超时保护、独立 Session、SQLite 锁重试,是一个生产级的调度实现。

2.6 消息队列

四级优先级调度、消息去重、死信处理。令牌桶算法做限流,按用户维度控制。对于多渠道同时接入的场景,这套队列系统保证了消息处理的可靠性。


三、技能插件系统

CountBot 内置了 10 个技能插件,覆盖日常使用的主要场景:

技能说明是否需要配置
百度搜索网页搜索、百科、AI 智能生成需要 API Key
高德地图路线规划、POI 搜索需要 API Key
邮件管理QQ/163 邮箱收发需要授权码
图片分析智谱/千问视觉模型需要 API Key
图片生成ModelScope 文生图需要 API Token
天气查询wttr.in 全球天气无需配置
新闻聚合中文新闻 + AI 资讯无需配置
定时任务聊天式创建管理无需配置
网页设计HTML 生成 + Cloudflare 部署需要 API Token
浏览器自动化网页操作、截图、数据提取需手动安装

技能插件的设计是松耦合的,每个技能是一个独立目录,包含配置文件和脚本,不影响核心代码。


四、国产大模型适配

通过 LiteLLM 统一接口层,CountBot 兼容 OpenAI / Anthropic / Gemini 协议,原生支持:

国产大模型: 智谱 AI(GLM-5、免费的 GLM-4.7-Flash)、千问(Qwen3.5-Plus)、Moonshot(Kimi K2.5)、MiniMax(M2.5)、DeepSeek、豆包、文心、混元、零一万物、百川

国际大模型: OpenAI、Anthropic、Gemini、Groq、Mistral 等

本地部署: Ollama、vLLM、LM Studio

零成本上手方案: 注册智谱 AI → 获取免费 API Key → 在 CountBot 设置页面填入 → 开始使用。


五、多渠道接入

渠道连接方式状态
Web UI内置✅ 可用
飞书WebSocket 长连接✅ 可用
钉钉Stream 模式✅ 可用
QQ官方 SDK✅ 可用
TelegramLong Polling✅ 可用
微信公众号 API🔜 即将上线
DiscordGateway🔜 即将上线

所有渠道共享同一套记忆系统,在飞书上聊的内容,切到 QQ 上 AI 也记得。


六、快速开始

方式一:Python 运行

git clone https://github.com/countbot-ai/countbot.git cd countbot pip install -r requirements.txt python start_app.py 

方式二:下载桌面版

前往 https://github.com/countbot-ai/CountBot/releases 下载对应平台的安装包,支持 Windows、macOS、Linux。

启动后访问 http://localhost:8000,在设置页面配置 LLM 提供商即可。全 Web 界面管理,不需要编辑任何配置文件。


七、总结

CountBot 的定位很清晰:一个为个人用户设计的、轻量的、中文优先的 AI Agent 框架。

  • 21K 行代码,易读易扩展
  • 智能记忆 + 主动问候,不只是工具,更像伙伴
  • 国产大模型深度适配,零成本可上手
  • 多渠道统一,一套代码服务所有平台
  • MIT 协议,完全开源

项目今天正式开源,欢迎 Star、Fork、Issue、PR。

GitHub:https://github.com/countbot-ai/CountBot

Read more

Copilot代理与网络配置全攻略(突破访问限制的终极方法)

第一章:Copilot代理与网络配置全攻略(突破访问限制的终极方法) 在使用 GitHub Copilot 的过程中,开发者常因网络策略或区域限制无法正常激活服务。通过合理配置代理与网络环境,可有效绕过此类问题,确保代码补全功能稳定运行。 配置本地代理服务器 为确保 Copilot 能够连接至远程 API,建议在本地部署 HTTP 代理服务。以下是一个基于 Node.js 的简易代理示例: // proxy-server.js const http = require('http'); const net = require('net'); // 创建 HTTP 代理服务器 const server = http.createServer((req, res) => { // 允许跨域请求 res.setHeader(

By Ne0inhk

解决VsCode远程服务器上Copilot无法使用Claude的问题

最近在用vscode中的GitHub copilot,发现无法使用claude系列的模型 很多小伙伴知道要开代理,开往带你以后claude确实会出来,本地使用没有任何问题,但是如果使用远程服务器ssh,claude系列的模型就消失了,参考这篇博客https://blog.ZEEKLOG.net/qq_40620465/article/details/152000104 按照博主的方法,需要加一个改动,在设置远程服务器(注意不是“用户”)的setting.json时需要加入"http.useLocalProxyConfiguration": true, 完成后再重启vscode,claude就有了:

By Ne0inhk
Git Rebase 详解:原理、使用场景与回滚操作

Git Rebase 详解:原理、使用场景与回滚操作

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[[email protected]] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? * 专栏导航: 码农阿豪系列专栏导航 面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️ Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻 Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡 全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀 目录 * Git Rebase 详解:原理、使用场景与回滚操作 * 引言 * 目录 * 1. 什么是 Git Rebase? * 1.1

By Ne0inhk

Git认证错误完全指南:从零开始解决‘password authentication is not supported‘

快速体验 1. 打开 InsCode(快马)平台 https://www.inscode.net 2. 点击'项目生成'按钮,等待项目生成完整后预览效果 输入框内输入如下内容: 开发一个交互式Git认证学习工具,帮助新手解决'remote: invalid username or token'问题。功能:1) 图形化SSH密钥生成向导 2) 模拟Git操作环境 3) 错误情景演练 4) 即时反馈系统 5) 知识测验。使用React构建Web应用,集成Markdown教程。 最近在学Git的时候,遇到了一个让人头疼的错误提示:remote: invalid username or token. password authentication

By Ne0inhk