13|智能画师:用CrewAI和A2A创建绘画智能体
CrewAI 开发框架
CrewAI 是一个开源的多智能体框架,支持工具集成,用于构建一组协作完成任务的智能体(Agents)。它的设计理念是:每个 Agent 都具备特定角色、工具和目标,通过任务分工与信息共享共同解决复杂问题。
CrewAI 能够提供类人团队的任务执行方式,不但可以构建单智能体助手,更可以构建“项目经理 + 设计师 + 执行者”这样的模拟团队。CrewAI 的另一个优势是可扩展性和生产级部署,因此其实可以广泛应用于你的数据分析、内容创作、自动化流程等场景。
思考题
1、在多个 Agent 并发调用图像生成工具的场景中,如何设计缓存机制以避免图像混淆或数据污染?
提示:
目前系统通过 session_id 隔离用户会话缓存。
思考是否还需要对 image_id 添加命名策略或过期策略。
考虑缓存的清理机制或最大容量限制。

生成图像的方法 generate_image_tool 需要优化,它是取的最后一次生成的图像,如果有 AgentA 和 AgentB同时在一个会话中生成新图像,Agent A可能会错误地引用Agent B最新生成的图像。
解决方案:强制显式引用。
如果 Agent 需要修改现有图像,它必须通过 artifact_file_id 参数显式地引用该图像的 image_id。如果 artifact_file_id 未提供或无效,则不应尝试从缓存中推断任何图像,而是视为生成新图像的请求。
如果Agent需要生成新图像,则不应提供 artifact_file_id。工具将生成一个新的 uuid4().hex 作为 image_id,并将新图像及其ID返回给Agent。Agent应在后续步骤中明确使用此新ID。
如果缓存满了,则无法生成新的图像,可以在放入缓存的时候,设置过期时间。InMemoryCache 类的 set 方法已实现,调用 set 方法时传入 ttl 可以设置过期时间。
最近最少使用 (LRU) 策略
LRU 方案,修改 InMemoryCache 类:
在 init 中添加 expiry_time_seconds 和 max_size 参数。
修改 set 方法,使其存储时间戳并实现 LRU 淘汰逻辑。
修改 get 方法,使其检查过期时间并更新时间戳,同时更新 LRU 顺序。
添加 clean_expired 方法用于主动清理。启动独立线程调用 clean_expired 方法
2、如果用户连续发送多轮提示(如“再给它加上一顶帽子”),如何设计智能画师 Agent 以理解上下文并自动复用上一轮生成的图像?提示:当前版本通过 artifact_file_id 实现图像修改。思考如何自动识别“上一张图”。是否需要结合上下文理解(CoT 或对话历史追踪)?
对于每个会话都维护一个存放图像的字典(Python 3.7+ 的字典会保留插入顺序),修改 generate_image_tool 方法将图像 id 存放到字典中。
修改 invoke 方法,如果没有明确提供 artifact_file_id,尝试自动复用当前会话中最新生成的图像 ID 作为 artifact_file_id,并将其传递给图像生成工具。
本地版
uv run 02_CrewAI_Agent.py
代理需要切换下。

任务执行成功,生成图片可能失败,可以多试几次。


多 Agent
进入 agents/crewai_zh 目录,并参考 agents/crewai_zh/README.md 的说明,启动智能画师 Agent 服务。
uv run .之后,就可以把智能画师 Agent 添加到 UI 应用程序中。





