从零开始搭建飞书智能助手——第一步:引入SpringBoot、FastApi实现与助手对话
用 Spring Boot FastAPI 搭建飞书 AI 个人助理整体架构DeepSeek APIbutler-agent :8000personal-butler :8080飞书开放平台飞书用户DeepSeek APIbutler-agent :8000personal-butler :8080飞书开放平台飞书用户发送文本消息POST /feishu/callback验签 / 解密 / 异步处理200 OK立即返回POST /api/chat {prompt}chat.completions.create回复文本{reply}发送消息 API机器人在会话中回复当前版本已完成「飞书 ↔ LLM 自由对话」闭环。提醒、MySQL、重复闹钟等能力在下一期迭代。项目结构personal-butlerJavapersonal_butler/ ├── pom.xml ├── Dockerfile # Maven 多阶段构建 → JRE 17 Alpine ├── docker-compose.yml # 编排 personal-butler butler-agent ├── .env # 飞书凭证不入库 └── src/main/java/com/liaoyx/personalbutler/ ├── PersonalButlerApplication.java ├── web/ # HTTP 入口 │ ├── FeishuCallbackController.java # POST /feishu/callback │ └── HealthController.java # GET /health ├── agent/ │ └── ButlerAgentClient.java # 调用 butler-agent ├── config/ │ ├── AsyncConfig.java # Async 线程池 │ ├── RestClientConfig.java # HTTP/1.1 RestClient │ └── properties/ │ ├── FeishuProperties.java │ └── ButlerAgentProperties.java └── feishu/ ├── callback/ # Webhook验签、解密、事件分发 ├── client/ # 飞书 Open API发消息、取 token └── message/ # 消息解析 → 调 agent → 回复包设计原则web/— 控制器只做 HTTP 适配feishu/callback/— 入站安全 事件路由feishu/client/— 出站Open APIfeishu/message/— 业务编排agent/— AI 服务边界以后换模型不影响飞书层butler-agentPythonbutler_agent/ ├── Dockerfile ├── requirements.txt ├── .env # DEEPSEEK_API_KEY不入库 └── app/ ├── main.py # FastAPI/health, /api/chat ├── config.py # pydantic-settings └── llm.py # DeepSeek 调用结构刻意保持极简一个文件负责路由一个文件负责 LLM后续再加agent.pyFunction Calling和reminder_client.py调 personal-butler API。飞书接入三个关键点1. Webhook 必须快速返回飞书事件订阅要求1 秒内响应否则重试。消息处理调 LLM可能耗时数秒因此AsyncpublicvoidhandleMessageReceive(FeishuCallbackPayloadpayload){// 解析文本 → 调 agent → 飞书回复}Controller 收到im.message.receive_v1后立即返回空字符串实际逻辑在异步线程执行。2. 安全验签 可选加密FeishuCallbackService处理两层安全Verification Token— 校验请求来源Encrypt Key— AES 解密 payload飞书开启加密时Signature— 校验X-Lark-Signature请求头feishuCallbackService.verifySignature(timestamp,nonce,signature,rawBody);returnfeishuCallbackService.handleCallback(rawBody);URL 验证首次配置回调地址返回 challenge{challenge:xxx}3. 发消息Tenant Access Token 缓存FeishuApiClient负责用app_idapp_secret换tenant_access_token内存缓存 token过期前 60 秒刷新调用im/v1/messages发文本消息飞书开放平台配置步骤登录 飞书开放平台创建企业自建应用开启机器人能力事件订阅→ 添加im.message.receive_v1接收消息请求地址填写https://你的域名/feishu/callback权限管理 → 开通「获取与发送单聊、群组消息」把凭证写入personal_butler/.envFEISHU_VERIFICATION_TOKENxxxFEISHU_ENCRYPT_KEYxxx# 若开启加密FEISHU_APP_IDcli_xxxFEISHU_APP_SECRETxxxBUTLER_AGENT_BASE_URLhttp://butler-agent:8000本地调试时用 ngrok 或 frp 把 8080 暴露到公网。消息处理全流程以用户发送「你好」为例FeishuCallbackController → FeishuCallbackService.handleCallback() → im.message.receive_v1 ? → FeishuMessageEventHandler.handleMessageReceive() [Async] → 跳过机器人自身消息 → FeishuMessageParser 解析文本 → ButlerAgentClient.chat(prompt) → POST http://butler-agent:8000/api/chat → FeishuMessageService.reply(chatId, reply) → FeishuApiClient.sendTextMessage()服务间 HTTP 契约POST /api/chat Content-Type: application/json {prompt: 用户说的话} → {reply: AI 回复}butler-agentDeepSeek 代理butler-agent 目前是一个LLM 代理核心代码defchat(prompt:str)-str:clientOpenAI(api_keysettings.deepseek_api_key,base_urlsettings.deepseek_base_url,)responseclient.chat.completions.create(modelsettings.deepseek_model,messages[{role:user,content:prompt}],)returnresponse.choices[0].message.contentor配置项.envDEEPSEEK_API_KEYsk-xxxDEEPSEEK_BASE_URLhttps://api.deepseek.comDEEPSEEK_MODELdeepseek-chat使用 OpenAI 兼容 SDK 调 DeepSeek换模型只需改环境变量。踩坑记录RestClient 与 uvicorn 的 HTTP/2 问题Spring Boot 3 默认 RestClient 可能走 JDK HttpClient 并尝试 HTTP/2 升级与 uvicorn 存在兼容问题。解决方式显式使用 HTTP/1.1BeanRestClientrestClient(){returnRestClient.builder().requestFactory(newSimpleClientHttpRequestFactory()).build();}避免回复循环飞书机器人在群里发消息后也会触发im.message.receive_v1。需要在 handler 里过滤sender_type app的消息否则会无限对话。密钥不要入库.env已在.gitignore中。团队协作用.env.example提供模板不含真实密钥。Docker 部署personal_butler/docker-compose.yml一键启动两个服务services:personal-butler:build:.ports:[8080:8080]env_file:[.env]environment:BUTLER_AGENT_BASE_URL:http://butler-agent:8000depends_on:[butler-agent]butler-agent:build:../../butler_agentports:[8000:8000]env_file:[../../butler_agent/.env]启动cdpersonal_butlerdockercompose up--build容器端口健康检查personal-butler8080GET /healthbutler-agent8000GET /healthpersonal-butler 使用多阶段 DockerfileMaven 编译 → 拷贝 jar 到 Alpine JRE 镜像最终镜像体积小、无构建工具残留。技术栈汇总层级personal-butlerbutler-agent语言Java 17Python 3.11框架Spring Boot 3.3.5FastAPI 0.115HTTP 客户端RestClient—LLM—OpenAI SDK → DeepSeek构建/运行Maven Dockerpip uvicorn测试JUnit 5 MockMvc—当前能力 vs 演进路线能力现状下一期飞书收发消息✅—LLM 自由对话✅ 单轮多轮记忆自然语言建提醒❌butler-agent Function Calling单次 / 重复闹钟❌personal-butler MySQL MyBatis提前 N 分钟提醒❌advance_minutes 定时调度到点飞书推送❌Scheduled 扫描 主动发消息下一期目标架构MySQLbutler-agentpersonal-butler飞书用户MySQLbutler-agentpersonal-butler飞书用户到点提醒我今天下午2点有面试/api/chat带 userId, chatIdLLM 识别 create_reminderPOST /api/remindersMyBatis 写入已设置提醒查到期提醒⏰ 提醒面试总结personal-butler butler-agent 的组合用最小可行架构跑通了飞书 AI 助理的核心链路personal-butler负责「脏活累活」— 飞书安全、异步、发消息butler-agent负责「聪明的事」— LLM 理解与决策Docker Compose让两个服务一键联调这种拆分让每一层职责清晰后续加提醒、加数据库、加更多 Agent 工具都不需要动飞书接入层。附录API 速查personal-butler方法路径说明GET/health健康检查POST/feishu/callback飞书 Webhookbutler-agent方法路径说明GET/health健康检查POST/api/chatLLM 对话

相关新闻

Java毕设项目:基于 SpringBoot 技术的社区智能化健康服务系统的设计与实现 基于 SpringBoot 的社区健康数据管理系统 (源码+文档,讲解、调试运行,定制等)

Java毕设项目:基于 SpringBoot 技术的社区智能化健康服务系统的设计与实现 基于 SpringBoot 的社区健康数据管理系统 (源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/27 6:14:37阅读更多 →
短视频矩阵运营是否适合中小企业

短视频矩阵运营是否适合中小企业

在数字化营销快速发展的今天,越来越多的中小企业开始关注短视频矩阵运营。但对于资源有限、团队不完善的中小企业来说,这种模式是否真的适合?本文将从行业背景、企业需求、服务模式等角度展开分析,帮助读者更全面地理解这一问题。…

2026/6/27 6:14:37阅读更多 →
先进封装半导体厂家推荐哪家:四大权威厂商深度解析!

先进封装半导体厂家推荐哪家:四大权威厂商深度解析!

在后摩尔时代,先进封装已成为突破芯片性能瓶颈、实现高密度异构集成的核心路径。面对 “先进封装半导体厂家推荐哪家” 的行业核心诉求,结合技术实力、产能规模、客户口碑与国产化适配度,本文权威推荐四大标杆企业,诺顶智能凭借设…

2026/6/27 6:14:37阅读更多 →
Go语言的reflect.DeepEqual深度相等与自定义类型的比较语义定义

Go语言的reflect.DeepEqual深度相等与自定义类型的比较语义定义

Go语言中的reflect.DeepEqual函数是用于深度比较两个值是否相等的强大工具,尤其适用于复杂结构体、切片、映射等复合类型的比较。当涉及自定义类型时,其比较语义可能引发意料之外的结果。理解其工作原理及如何定义自定义类型的比较逻辑,对于编…

2026/6/27 7:29:40阅读更多 →
【小白向】一站式完整部署流程,一键部署 OpenClaw v2.7.9 新手一次性完成安装(最新安装包)

【小白向】一站式完整部署流程,一键部署 OpenClaw v2.7.9 新手一次性完成安装(最新安装包)

OpenClaw(小龙虾)Windows 一键部署实操手册|十分钟搭建专属本地数字员工 适配平台:Windows 10/11(64 位)|零基础友好|全可视化界面|无编程门槛 当下热度较高的开源 AI 智…

2026/6/27 7:29:40阅读更多 →
【小白向】新手专属优化部署包,一键部署 OpenClaw v2.7.9 跳过繁琐环境调试(最新安装包)

【小白向】新手专属优化部署包,一键部署 OpenClaw v2.7.9 跳过繁琐环境调试(最新安装包)

OpenClaw(小龙虾)Windows 一键部署实操手册|十分钟搭建专属本地数字员工 适配平台:Windows 10/11(64 位)|零基础友好|全可视化界面|无编程门槛 当下热度较高的开源 AI 智…

2026/6/27 7:29:40阅读更多 →
不想打开PS?分享3个我最近常用的在线抠图网站

不想打开PS?分享3个我最近常用的在线抠图网站

平时做 PPT、写文档或者处理商品图片,经常会遇到一个问题:想把图片背景去掉。以前我都是用 Photoshop,后来发现很多图片只是简单去个背景,打开 PS 的时间都比处理图片久。于是这段时间陆续试了不少在线抠图工具,这里分…

2026/6/27 7:29:40阅读更多 →
电脑密码忘记零基础教程

电脑密码忘记零基础教程

#电脑 #恢复界面利用PE U盘清楚密码 WIN10及以下系统版本。 先关机,在插入pe U盘,开机的时候点击F12,选择U盘启动,即可进入PE系统。(推荐微PE系统)打开桌面上的“Dism”图标,选择上方的系统硬盘…

2026/6/27 7:29:40阅读更多 →
前端交互动效实现

前端交互动效实现

前端交互动效实现:提升用户体验的关键 在当今的Web开发中,前端交互动效已成为提升用户体验的重要手段。无论是按钮点击反馈、页面过渡动画,还是复杂的滚动视差效果,精心设计的动效都能让用户感受到流畅与愉悦。随着CSS3、JavaScr…

2026/6/27 7:24:40阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/27 5:46:02阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →