微信扫码
添加专属顾问
在日常工作中,编写个人和团队的工作周报是一项既繁琐又枯燥的任务。幸运的是,这种场景非常适合利用人工智能(AI)技术来简化。尽管市面上已有多种基于GPT的智能体,如国内的文心一言、讯飞星火、智谱清言等,它们能够对用户提供的内容进行总结,但如果没有用户输入,它们便无法凭空创造内容。此外,对于团队周报而言,市场上尚未出现能够有效汇总部门成员工作流的解决方案。
为了解决这一问题,我采用了多智能体协作的方法,并选择了CrewAI框架来构建一个自动化的秘书团队。CrewAI是一个专注于多智能体协作的框架,它在团队协作能力、通信接口、内置算法、并行计算、扩展性和应用场景等方面展现出显著优势。
想了解CrewAI,可以看下这篇公众号文章。 《跟着我的步骤,轻松打造出 AI 智能体》
接下来,我将分享如何利用CrewAI框架创建多智能体应用,以实现自动整理、汇总和发送部门成员的周报。
准备工作:
首先,为了实现这一工作流,我们需要明确智能体的角色、任务以及所需工具。由于我们的目标是汇总个人周报并整合成团队周报,我开发了自定义工具来操作语雀文档和阿里云邮箱,这些工具均按照CrewAI的规范构建。
核心文件与智能体定义:
在CrewAI的核心文件中,agents.yaml和tasks.yaml定义了智能体和任务,而crew.py和main.py则定义了智能体的逻辑和输入信息。
writer:
role: >
工作周报填写者
goal: >
汇总每周的部门成员的工作周报,形成部门的工作周报。
backstory: >
你是一个经理秘书,负责汇总每周的部门成员的工作周报,形成部门的工作周报。你需要对每个成员的工作周报进行审核,确保每个成员的工作周报都是真实的,然后将每个成员的工作周报进行汇总,形成部门的工作周报。
sender:
role: >
邮件和语雀发送者
goal: >
发送邮件以及语雀文档给领导
backstory: >
你是一个邮件和语雀发送者,负责发送邮件以及语雀文档给领导。你需要将部门的工作周报发送给领导,确保邮件的内容是正确的,不要单独创建附件。
writing_task:
description: >
汇总本部门成员的工作周报,形成部门的工作周报。
请确保最终形成的文档是中文的。
请尽量不要做内容的压缩,要保证包含所有的工作内容
不要把名字列进入,只需要把他们干的工作写进去就行。
调用成员周报获取工具只需要执行一次,不要反复去调用,因为每次获取的都是一样的。
请保证完成部门周报的整体创作以后询问人类是否要发送邮件和发布语雀文档。
最终形成的部门的工作周报,需要按照以下的样例进行填写,输出markdown格式:
## 本周重点工作
### 产品A 相关
* xxxx 5.5.6:本周完成了后段bug的修复。
* XXXX 6 & 6.2 开发:计划进行 XXX 6.0 测试提的问题修复及 XXX 6.2 开发。
### XXX 项目
* 进行了多项优化,包括告警规则、日志下载接口、节点管理界面等。
* 计划进行项目维护和版本适配。
### 前端逻辑
...
## 下周计划
* 继续进行 XXX 6 相关开发和问题处理。
* XXX 3.0 页面组件后续开发。
...
expected_output: >
一篇markdown格式的部门的工作周报。
send_task:
description: >
发送邮件和语雀文档给相关领导。
没有汇总完成之前,请不要发送邮件和发布语雀文档。
发送邮件和发布语雀的content参数请保证是markdown格式的部门工作周报的内容。
邮件内容示例:
本周主要完成……工作,以下为详细内容:
[汇总的部门工作周报]
***********************************************************************
张三 /Zhangsan
Mobile:86-13122223333;
Email:zhagsan@example.com
XXXXXXX有限公司 / XXXXXXXX Technology Ltd.
***********************************************************************
语雀文档内容示例:
[汇总的markdown格式部门工作周报]
expected_output: >
任务是否完成
智能体逻辑编排:
在crew.py中,我们通过定义WeeklyReportCrew类来编排智能体的工作流程。每个智能体都有自己的角色和目标,例如,writer智能体的目标是汇总部门成员的周报,而sender智能体则负责将周报发送给领导。
from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task
from weekly_report.tools.ali_mail import SendEmailTool
from weekly_report.tools.send_yuque_doc import SendYuqueDocTool
from weekly_report.utils.llms import LLMs
from langchain.agents import load_tools
# Uncomment the following line to use an example of a custom tool
from weekly_report.tools.weekly_reports import GetWeeklyReportsTool
# Check our tools documentations for more information on how to use them
# from crewai_tools import SerperDevTool
llm = LLMs(model_name="glm-3-turbo").get_llm()
function_calling_llm = LLMs(model_name="gpt-3.5-turbo-0125").get_llm()
get_weekly_reports_tool = GetWeeklyReportsTool()
send_email_tool = SendEmailTool()
send_yuque_doc_tool = SendYuqueDocTool()
human_tools = load_tools(["human"])
@CrewBase
class WeeklyReportCrew():
"""WeeklyReport crew"""
agents_config = 'config/agents.yaml'
tasks_config = 'config/tasks.yaml'
@agent
def writer(self) -> Agent:
return Agent(
config=self.agents_config['writer'],
tools=[get_weekly_reports_tool],
verbose=True,
llm=llm,
function_calling_llm=function_calling_llm,
allow_delegation=True
)
@agent
def sender(self) -> Agent:
return Agent(
config=self.agents_config['sender'],
tools=[send_email_tool, send_yuque_doc_tool],
verbose=True,
llm=llm,
function_calling_llm=function_calling_llm,
allow_delegation=True
)
@task
def writing_task(self) -> Task:
return Task(
config=self.tasks_config['writing_task'],
agent=self.writer(),
# context=[self.manage_task()]
)
@task
def send_task(self) -> Task:
return Task(
config=self.tasks_config['send_task'],
agent=self.sender(),
context=[self.writing_task()]
)
@crew
def crew(self) -> Crew:
"""Creates the WeeklyReport crew"""
return Crew(
agents=self.agents, # Automatically created by the @agent decorator
tasks=self.tasks, # Automatically created by the @task decorator
# process=Process.sequential,
verbose=2,
process=Process.hierarchical, # In case you wanna use that instead https://docs.crewai.com/how-to/Hierarchical/
manager_llm=function_calling_llm,
)
自定义工具开发:
在CrewAI框架中,自定义工具是通过Python类来实现的,这些类继承自BaseTool,并根据需要完成特定的任务。例如,SendEmailTool和SendYuqueDocTool是两个用于发送邮件和发布语雀文档的工具。
smtplib库来通过阿里云企业邮箱发送邮件。工具的输入是一个包含邮件内容的字符串,输出是发送成功或失败的信息。import os
from dotenv import load_dotenv
from crewai_tools import BaseTool
from pydantic.v1 import BaseModel, Field
from typing import Type, List
class SendEmailInput(BaseModel):
content: str = Field(..., title="邮件正文", description="周报的具体内容")
class SendEmailTool(BaseTool):
name: str = "发送邮件工具"
description: str = "用于发送部门周报邮件,标题和收件人都不需要填写,固定为AI&UI小组工作周报"
args_schema: Type[BaseModel] = SendEmailInput
def send_email(self, content: str):
load_dotenv()
# 配置阿里企业邮箱
mail_host = "smtp.qiye.aliyun.com"
sender = os.getenv("ALI_SENDER")
passwd = os.getenv("ALI_PASSWD")
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr
receivers = os.getenv("ALI_RECEIVERS")
# 用markdown格式发送邮件
content = f"""{content}"""
import markdown2
content = markdown2.markdown(content)
print(content)
print(sender)
print(receivers)
msg = MIMEText(content, 'html', 'utf-8')
msg['From'] = formataddr(["xdfs", sender])
msg['To'] = receivers
msg['Subject'] = Header("AI&UI小组工作周报", 'utf-8').encode()
print(msg)
to_list = receivers.split(',')
try:
server = smtplib.SMTP_SSL(mail_host, 465)
server.login(sender, passwd)
server.sendmail(sender, to_list, msg.as_string())
server.close()
return '邮件发送成功'
except Exception as e:
return '邮件发送失败 %s' % e
def _run(self, content: str) -> str:
load_dotenv()
result = self.send_email(content)
return result
from crewai_tools import BaseTool
from dotenv import load_dotenv
import os
import requests
class SendYuqueDocTool(BaseTool):
name: str = "发送语雀文档工具"
description: str = "用于发送或者发布语雀文档到语雀知识库的工具"
def get_this_friday(self):
import datetime
today = datetime.date.today()
today_weekday = today.weekday()
print(today_weekday)
if today_weekday == 4:
return today
elif today_weekday > 4:
return today - datetime.timedelta(days=(today_weekday-4) % 7)
else:
return today + datetime.timedelta(days=(4 - today_weekday) % 7)
def _run(self, content: str) -> str:
load_dotenv()
auth_token = os.getenv("YUQUE_AUTH_TOKEN")
login = os.getenv("YUQUE_LOGIN")
slug = os.getenv("YUQUE_SLUG")
# 获取周报所在目录的uuid
get_toc_url = f"https://www.yuque.com/api/v2/repos/{login}/{slug}/toc"
header = {"X-Auth-Token": auth_token}
res_toc = requests.get(get_toc_url, headers=header)
toc = res_toc.json()
this_friday = self.get_this_friday().strftime("%Y%m%d")
print(this_friday)
target_uuid = ""
for item in toc["data"]:
if item["type"] == "TITLE" and item["title"] == this_friday:
target_uuid = item["uuid"]
break
print(target_uuid)
# 需要单独调用更新目录接口才能更新文档到目录
if target_uuid == "":
return "未找到周报目录"
create_doc_url = f"https://www.yuque.com/api/v2/repos/{login}/{slug}/docs"
header = {"X-Auth-Token": auth_token}
data = {
"title": "部门工作周报",
"format": "markdown",
"body": content
}
created_article = requests.post(create_doc_url, headers=header, data=data)
update_toc_url = f"https://www.yuque.com/api/v2/repos/{login}/{slug}/toc"
data = {
"action": "appendNode",
"action_mode": "child",
"type": "DOC",
"doc_ids": [created_article.json()["data"]["id"]],
"target_uuid": target_uuid
}
response = requests.put(update_toc_url, headers=header, json=data)
return "创建语雀文档成功!"
运行流程:
writer智能体首先使用GetWeeklyReportsTool工具从语雀中获取团队成员的个人周报。writer智能体将这些信息汇总成一份完整的团队周报,按照预定义的Markdown模板进行格式化。sender智能体在确认周报内容无误后,使用SendEmailTool将周报通过邮件发送给领导,并通过SendYuqueDocTool将周报发布到语雀知识库中。避坑指南:
function_calling_llm,以避免潜在的错误。hierarchical进程模式会比sequential更有效。通过上述步骤,我们成功构建了一个自动化的秘书团队,它能够高效地完成周报的整理、汇总和发送工作。这不仅节省了大量的人力资源,也提高了工作效率和准确性。希望这篇文章能够帮助你在实际工作中应用AI技术,实现工作流程的自动化。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-06-30
一个业务一线同学,把 AI 真用起来之后的 12 个真实想法
2026-06-30
PRD 2.0:AI时代的需求文档长什么样(附腾讯模板)
2026-06-29
Rspack 2.1 发布:React Compiler 提速 10 倍!
2026-06-28
想转 AI 落地 FDE?先看 3 个核心能力项
2026-06-26
产品经理转FDE:一份6个月的生存手册
2026-06-26
年中了,试试让你的Agent快速写出半年总结?
2026-06-22
我花了三年读王阳明,结果不如用AI蒸馏他一次
2026-06-19
一位阿里产品经理的AI全流程提效实践:从需求到上线全覆盖
2026-05-18
2026-05-26
2026-06-04
2026-06-09
2026-04-16
2026-04-25
2026-04-14
2026-05-21
2026-04-09
2026-04-22
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。