- 它是唯一一个实现了流式打字效果输出的聊天工具,并且完全开放了API。
- 自然解决了用户管理和权限问题,如果没有特殊需求,项目不需要自行处理这些问题。
- 自然解决了聊天记录管理的问题。
因此,本项目几乎是专为飞书而生,部署后新建一个飞书机器人,把机器人的权限开通好,消息通知地址加上,立即可用。
基于前面的自然交互的理由,本项目目前也不支持把机器人加入到群里面去聊天,仅支持一对一私聊。因为在群里不可能理清楚上下文。对于其它类似项目在群里使用话题形式进行一人一卡片的对话方式,本人不感冒。
在聊天窗口需要放一个开启新会话的按钮,让用户主动截断对话,因为聊天窗口是连续的,程序并不知道什么时候应该截断对话开始新的上下文。
- 几乎支持大模型API支持的所有功能(Assistant API本来也是支持的,但OpenAI自己都放弃了,所以代码也删了,等以后用ResponseAPI代替)。对于飞书卡片无法正常显示的mermaid流程图,markmap思维导图,Latex数学公式都进行了解决,虽然不能改变飞书卡片,但用其它办法方便的实现。如果模型返回HTML代码,也可以在飞书里直接点击预览,不需要手工复制代码。
- 实现了一些Agent功能:包括自动按章节拆书总结,自动抓取网页内容进行问答,通过Function call自动查询天气,自动调用搜索引擎进行回答,自动调用画图模型(能够让GPT和Claude支持连续对话增量画图),用数学方式进行数学表达式计算,还能直接把数据返回飞书卡片支持格式直接显示成动态可交互的图表(支持柱状图、折线图、饼图)。如果模型返回了SVG代码,会尝试在服务器端自动转成一张图片并发送到飞书。
- 还有几个高级Agent功能:比如自动拆解任务并多次调用搜索引擎查询不同的主题,最后汇总结果生成一份报告;在服务器端打开一个虚拟浏览器打开指定的网站进行自动化操作来完成用户的指令;以搜索或收集信息过程中将计划和分步骤结果写入到服务器端的一个markdown文件中,并发送到飞书;以及一个更高层的Agent可以调度其它所有Agent来完成复杂任务。
- 增加新模型和新Agent非常容易,复杂的Function call递归调用系统已经自动处理了,不用去关心。
- 虽然是为飞书而生,但仍然提供了WebApi接口,可以用来接入到自己的网页、小程序、各种原生App等等任何地方(每种项目我都有实际跑通的示例可证),而且Web端还多两个高级功能,返回文字回答的时候可以同时返回文字转语音,实现实时朗读(利用MiniMax的流式转语音功能,效果非常棒),还有封装了多家websocket接口为统一websocket接口,可以实现诸如实时语音识别成文字、实时双向翻译、OpenAI的realtime实时语音聊天接口等等接口的大一统。
- 可以很方便的接到很多个飞书机器人的后面,每个机器人负责某一个专一功能,比如专门读书的,专门使用浏览器的,等等。

ScreenRecording_1.mp4
一定要有Docker!
要有一台能编译和运行Docker镜像的服务器,并且有域名能够被外网正常访问。
需要在服务器上安装.net8 SDK。https://learn.microsoft.com/zh-cn/dotnet/core/install/linux?WT.mc_id=dotnet-35129-website
本项目运行需要一个Mysql和一个Redis,有专用的最好,没有的话在本机用Docker启动两个也可以,只要项目能连的上就行。(Redis是存储上下文的,如果Redis重启丢数据那当前的上下文就丢了。)
Mysql最好也能远程连接或者有其它管理界面,因为提示词模板和Function定义需要手动添加到这两个表里去,我没有做管理工具。
自己要有各家大模型公司的账号,以及可正常访问其服务器的方式。(走其它聚合API接口也可以,但不保证好用。)
- git clone 项目
- git checkout -b xxx #创建一个新的分支
- 在这个新分支下修改配置文件,也可以修改代码来满足自己的需求。也可以提交自己的文件push到自己的Git服务器。当我更新了主项目的时候你只要拉一下项目,然后把master分支往自己的分支合并一下就行了,就可以既保持主项目同步,又能管理自己的文件。
3.1 要有一个飞书机器人,并申请了所必须的权限,没有的话可以新创建一个。所需要的权限列表在readme目录下的permissions.json里。不是全都需要,但最好都加上。
3.2 把config.example.json文件复制成config.json文件,修改其中的所有关键信息。
3.3 改完以后运行builddocker.sh脚本编译并打包docker镜像。
3.4 如果需要在别的地方运行,把image push过去,如果在本地运行,docker run -p 8080:80就可以体验一下了。
3.5 把这个端口用任何方式映射到外网可访问,去配置飞书机器人的消息通知地址。在飞书开放平台机器人管理界面,事件与回调,事件配置和回调配置两个页面的请求地址都是 https://你的访问域名/api/ai/feishu/event ,只要地址能保存成功,基本上就没问题了。在事件配置里订阅两个事件:im.message.receive_v1,application.bot.menu_v6,在回调配置里订阅一个事件:card.action.trigger。
- 给飞书配置几个菜单,建议使用悬浮式菜单。至少需要一个『新会话』按钮,事件名称是menu_startnewcontext,一个切换模型的按钮,事件名称是menu_to_all,也可以将几个指定模型设为快捷菜单来快速切换,事件名称是menu_to_x 把x换成这个模型的枚举值对应的数字即可。
- 然后需要往chatgptprompts,然后给飞书菜单上再配一个提示词模板的按钮,可以将一些COT之类的复杂提示词变成一个按钮,用户点一下再输入自己的简单问题就可以了。当然不配置模板也不影响使用。
- 需要往chatgptfunctions里添加几个Function定义,这样内置的Function才会起作用。你也可以尝试调整Function的描述和触发词,但参数名称不要改。
(在readme目录下有两个excel文件,你可以直接导进去。)
{
"Site": {
"Host": "https://xxx/", //通过什么域名可以访问到这个容器,可以带路径,一定要/结尾
"MasterToken": "Ya" //用来保护WebApi接口的Token,在你想开发自己的权限处理方式之前,生成一个复杂Token放在这儿,可以用这个Token来请求Api接口
},
"Connection": {
"DB": "xx", //Mysql标准连接字符串,如 server=xxx;database=xxx;uid=xxx;pwd=xxx;SslMode=none
"Redis": "xx" //Redis标准连接字符串
},
"AliOss": { //阿里云OSS的配置,个别模型上传图片时必须用地址,才需要用到这个功能,没有可以直接忽略
"Endpoint": "xx",
"AccessKey": "",
"AccessSecret": "",
"BucketName": ""
},
"FeiShu": { //飞书机器人的配置,可以只配置Main这一个,Book是用来让你自行添加多个其它机器人的时候的参考,只需要复制一个BookFeishuService,复制一个BookFeishuController,改一点里面的内容就可以了。
"Main": {
"AppId": "cli_",
"AppSecret": ""
},
"Book": {
"AppId": "cli_",
"AppSecret": ""
}
},
"UserLevel": { //有些模型可能你不想让公司所有人看到,可以配置权限级别,数字随便写,跟下面的模型后面的数字是对应的。
"xx": 50, //前面的xx是飞书里面的用户ID,在飞书后台的组织架构中可以查看每个人的user_id,注意不是OpenId。飞书发过来的消息里也都有每个人的user_id,后面的数字就是他的权限级别。
"xxx": 100 //这里只需要添加高级别用户,不添加的都默认为0
},
"ModelUsed": {
"GPT4o_Mini": 1, //哪些模型需要开启可见。因为项目接了所有模型,但实际上有些可能暂时没价值,或暂时不想让别人看到。只有在这里添加了的才会在他的飞书上显示出来可选。
"GPT4o": 10, //前面是模型的ID,不是Name,也就是枚举值M里面的名字,后面的数字如果1就是所有人可见,如果大于1,就只有上面的用户权限>=它的才可见。如果是0就不可见了。虽然不可见,但API仍然可以通过这个模型ID来调用它。
}
}后面就是各个模型的地址和Key等等,看情况配置,没有配置Key的,上面也不要加为可用。
大部分公司模型名称是统一的,所以不用配置,只有豆包每个人看到的模型ID是不一样的,需要配置进去。还有的公司有两套验证机制,所以可能要配置多套Key。
项目问题、AI爱好者、开发爱好者,欢迎进飞书群交流。
如果你觉得项目对你有帮助,欢迎打赏。

