OpenClaw从入门到入土:保姆式教学,如何用龙虾自动生成项目周报 08
一.声明
没有套路,只有真诚。接下来,请允许我手把手服侍您如何用龙虾生成项目周报。
功能靠谱实用,牺牲了本人十来个日夜的青春,冷落了多少老师才换来的突破性成果,请务必重视。
当然,要掌握的不仅是实现一个功能,更重要的是理解龙虾以及AI大模型的套路,总结出一套行之有效并且可以复制的打法,去驾驭AI,真正做到为己所用。
二.拆解生成项目周报的工作流
要实现一个功能,必须先了解其应用场景,用户以及工作流程。
否则就算把功能弄出来,也达不到实用功效。
让龙虾自动生成项目周报的功能,我们可以按以上思路拆解如下:
应用场景:在飞书APP里进行消息对话
用户:某个项目组成员,飞书用户
工作流程:
1. 触发关键词:飞书用户在与龙虾助手的聊天对话框里,输入自动生成项目周报的提示词,例如:“/单个项目周报 5060项目”
2. 检查关键词:龙虾助手收到提示词,先检查提示词有没有错误,有问题就报错,没问题就把先设定好的prompt(指令提示)、项目周报模板以及skill发给AI大模型
3. 搜集信息:AI大模型根据prompt提示以及skill工具,搜集并整理飞书聊天群信息,
4. 生成周报:AI模型把整理后聊天信息灌进项目周报模板里,生成项目周报
5. 发送周报:最后,龙虾把项目周报发送到与用户的聊天对话框里,完成功能应用

三.龙虾与AI大模型的尿性
正式实现功能前,我们得先了解龙虾与AI大模型的工作尿性。如果弄不明白,那么接下来的工作就会被这两坑货带进沟里。
首先要搞清的是龙虾如何给AI大模型发送消息?
龙虾收到用户的指令后,会把相关的所有prompt(具体表现为markdown文件,后缀名.md),以及skill(具体表现为JavaScript或Python文件,后缀名.js 或.py)拼接成上下文发给AI大模型。
为啥龙虾要这样搞?
因为当前的AI大模型只认上下文,也就是一个超大的prompt指令。
其次是龙虾塞给AI大模型的上下文,具体包含哪些东西,AI大模型阅读上下文的时候有没有一个优先次序?
龙虾塞给AI大模型的上下文包括如下文件,按序号体现优先级,1为最高:
1. AGENTS.md,龙虾的系统性的自我描述或者要求,本人直接干掉了里面所有内容。不是因为穷怕浪费token,而是单纯地想让AI大模型猜猜我是谁
2. Skill.md,对某个被调用的功能描述以及对AI模型的具体操作要求
3. History,用户与龙虾助手的聊天记录
4. User message,用户后续发送的消息
从上面可以看出,龙虾里的skill工具是不会直接传给AI大模型的,那么AI大模型如何调用skill工具呢?
这就是最后你必须搞清楚的AI大模型的工作尿性,这也是很多人卸载龙虾的真正原因:
如果你不在prompt里面规定死AI大模型必须调用哪些工具,AI大模型会自由发挥,信马由缰,保证你每次发出相同的指令会收到各种不同的答案。
四.构建功能模块【重要】
搞懂了龙虾和AI大模型的工作尿性,我们开始按照工作流构建功能模块:
1. 我们向龙虾发送生成项目周报的指令,得保证龙虾认识这些指令,所以要构建一个registry.js命令注册表文件,里面存放用户指令,以及指令对应的skill工具名称:
module.exports = [{commands:["/单个项目周报 5060项目"],skill: "project-weekly-report"}];
2. 不同的项目有不同的周报,所以我们还得构建一个projects.js项目集合文件,里面存放所有的项目名称以及对应的项目飞书聊天群id,保证AI大模型能够从正确的渠道获取正确的信息:
module.exports = {"5060项目":{manager: "张三",groupId: "飞书群id(复制粘贴后替换成实际飞书群id)"},"5060项目":{manager: "李四",groupId: "飞书群id(复制粘贴后替换成实际飞书群id)"}};
3. 接下来就是编制Prompt,为了方便理解,我们把Prompt构建成SKILL.md文件,并在文件强制规定AI大模型必须使用我们提供的skill工具,而不能随意发挥:
---name: project-weekly-reportdescription: 基于飞书群聊记录自动生成项目周报,输出为Markdown格式,直接发送给用户---# 执行指令收到 `/单个项目周报 <项目名>` 指令后,**立即且只执行以下 exec 命令**,不做任何其他操作:node {baseDir}/index.jsnode 脚本已自行完成全部工作:拉取群消息 → AI提炼 → 填充MD模板 → 通过飞书API直接发送给用户。agent 的职责只有一个:**触发 exec,然后什么都不做**。
4. 为了防止AI大模型输出五花八门的周报,我们还得做一个模板,统一输出格式。所以继续构建project-weekly-report-template.md文件,作为项目周报模板:
# XXX项目周报# 一、本周工作完成情况| 上周工作任务 | 计划开始时间 | 计划完成时间 | 负责人 | 完成情况 | 未完成任务说明 || :--- | :--- | :--- | :--- | :--- | :--- ||| || || |# 二、本周工作问题点| 问题点 | 发生时间 | 解决方案 | 负责人 | 完成时间 || :--- | :--- | :--- | :--- | :--- || || || |# 三、下周工作计划| 下周工作任务 | 计划开始时间 | 计划完成时间 | 负责人 | 预计风险 | 应对措施 || :--- | :--- | :--- | :--- | :--- | :--- || || || ||
5. 前面都算是准备工作,从现在开始,我们开始构建skill工具,分别为index.js,FeishuAPI.js以及DocProcessor.js,其中:
index.js是主程序,前面提到过工作流(读取群消息,AI提炼,填充模板,通过飞书发送给用户)都通过它推动执行:
async function main(ctx):1. const match = matchSkill(messageText)2. await MessageSender.reply4. if (userSession.stage === "waiting_template")5. const userIds = messageProcessor.extractAllUserIds(ctx);6. await WeeklyReportGenerator.generate7. sessions.delete(userId); feishuAPI.clear(); messageProcessor.clear();
FeishuAPI.js是飞书会话程序,主程序index.js运行过程中,与飞书来回通信,并调用飞书数据,所以必须构建FeishuAPI.js,明确使用的飞书API接口,否则飞书鸟都不鸟你:
class FeishuAPI { … }:1. asyncgetTenantToken(ctx)2. async batchGetUserNames()3. async sendMessageDirect(ctx, chatId, text, msgType = "text")4. async setDocEditable(ctx, docToken, memberIds = [])
DocProcessor.js是周报文档处理程序,它包括让AI大模型去指定地方收集消息,指导大模型如何有效提取有用信息,找到模板,并生成最终的项目周报:
const WeeklyReportGenerator = { … }1. getTimeRange()2. asyncgenerate(ctx, deps, config)3. return docUrl;
五.文件存放位置
我们一共构建了7个文件,分别是:
registry.jsprojects.jsindex.jsSKILL.mdproject-weekly-report-template.mdFeishuAPI.jsDocProcessor.js
那么问题来了,这些文件要放到哪里,可以让龙虾读取并运行?
我们在龙虾的workplace里新建一个文件夹,取名为skills:

打开skills,再新建一个文件夹,取名为:project-weekly-report。
然后把上面7个文件全部复制粘贴到project-weekly-report文件夹里:

这样,龙虾就可以顺利执行我们的指令了。
至于skills文件夹能不能放在其他地方,其实也是可以的,不过龙虾对于不同地方的skills有着不同的执行优先级,workplace里面的skills执行优先级最高。

六.功能实用性解析
先看看我之前发的视频,体验一下最终效果:
再来聊一下这个功能框架的实用性:
1. 此功能架构设计可以随意扩展项目,只需要在project.js和registry.js里增加项目信息。
2. 现实工作环境中,一个项目一堆群,可以在project.js里随意增加群信息,然后AI自动搜集信息,大大减轻PM的工作量。
3. 如果工作沟通软件用的是个人微信,企业微信或者钉钉,那么只要替换FeishuAPI.js文件即可,保证APP平台的可移植。
4. 只要在工作沟通软件 + 龙虾 + AI大模型的环境下,任何生成项目相关的文档功能,都可以复用这套框架设计,大大减轻了skill的开发工作量。
吹完了牛X,接下来准备把上述7个文件的源代码出来,共享给大家,敬请期待。
(未经本人许可,请勿转载或商业用途)
夜雨聆风