CrewAI+FastAPI实现多Agent协作完成软件编码项目

目录:

一、项目简介和代码结构

本项目实现一个python编码智能体;通过三个角色(高级软件工程师,软件质量控制工程师,首席软件质量控制工程师)完成编码工作。

二、apiTest.py(实现游戏代码)

python 复制代码
import requests
import json
import logging


# 设置日志模版
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)


url = "http://localhost:8012/v1/chat/completions"
headers = {"Content-Type": "application/json"}


# 构造消息体
# 默认非流式输出 True or False
stream_flag = False
# 用户输入
# game = "What is the game you would like to build? What will be the mechanics?"

# game = '''
# 1、游戏名称:经典贪吃蛇
# 2、游戏描述:玩家控制一条不断移动的蛇,目标是吃掉屏幕上出现的食物,让蛇变得越来越长。游戏结束的条件是蛇撞到自己或墙壁。
# 3、游戏机制:
# 基本操作:玩家使用方向键(上下左右)控制蛇的移动方向。蛇只能向当前方向前进,不能倒退。
# 游戏目标:吃掉屏幕上随机出现的食物,每吃一个,蛇的长度会增加。游戏难度随着蛇的长度增加而提升。
# 得分系统:每吃一个食物得1分,游戏结束时,玩家的分数是最终蛇吃到食物的总数。
# 游戏结束条件:撞到自己的身体或撞到屏幕边界时,游戏结束。
# '''

game = '''
1、游戏名称:经典俄罗斯方块
2、游戏描述:玩家通过移动和旋转下落的方块,使它们在底部排成完整的行。每当一行被填满,行就会消失,玩家获得积分。方块下落速度控制在一个合理的速度上,不要快。要求四种不同形状的方块,分别为I、T、L、Z,每个方块由四个小方格组成。
3、游戏机制:
(1)基本操作:
方向键左/右:移动方块左右。
方向键下:加速方块下落。
方向键上:旋转方块。
(2)游戏目标:
排列下落的方块,使它们在底部形成完整的行。
当一行被完全填满,没有空隙时,该行会消除并获得积分。
(3)得分系统:
每消除一行得分1分,一次消除多行可获得额外得分。
随着时间推移,方块下落速度逐渐加快,难度逐步提升。
(4)游戏结束条件:当方块堆积到顶部,无法继续放置新的方块时,游戏结束。
'''



data = {
    "messages": [{"role": "user", "content": game}],
    "stream": stream_flag,
}


# 接收流式输出
if stream_flag:
    try:
        with requests.post(url, stream=True, headers=headers, data=json.dumps(data)) as response:
            for line in response.iter_lines():
                if line:
                    json_str = line.decode('utf-8').strip("data: ")
                    # 检查是否为空或不合法的字符串
                    if not json_str:
                        logger.info(f"收到空字符串,跳过...")
                        continue
                    # 确保字符串是有效的JSON格式
                    if json_str.startswith('{') and json_str.endswith('}'):
                        try:
                            data = json.loads(json_str)
                            if data['choices'][0]['finish_reason'] == "stop":
                                logger.info(f"接收JSON数据结束")
                            else:
                                logger.info(f"流式输出,响应内容是: {data['choices'][0]['delta']['content']}")
                        except json.JSONDecodeError as e:
                            logger.info(f"JSON解析错误: {e}")
                    else:
                        print(f"无效JSON格式: {json_str}")
    except Exception as e:
        print(f"Error occurred: {e}")

# 接收非流式输出处理
else:
    # 发送post请求
    response = requests.post(url, headers=headers, data=json.dumps(data))
    # logger.info(f"接收到返回的响应原始内容: {response.json()}\n")
    content = response.json()['choices'][0]['message']['content']
    logger.info(f"非流式输出,响应内容是: {content}\n")

会根据提示词游戏的规则生成游戏代码,在historyCode目录下。

三、问题分析

1、为啥流式和非流式输出都没有指定文件去写入游戏代码的响应,就直接生成一个游戏代码文件?

您的问题核心在于:为什么流式输出的内容会直接生成一个游戏脚本文件,而代码中并没有显式的文件写入逻辑? 这确实是一个值得深入探讨的现象。以下是详细分析:

关键原因:后端服务的 CrewtestprojectCrew 隐藏了文件生成逻辑

您观察到的现象(自动生成游戏脚本文件)是由 后端服务 的 CrewtestprojectCrew 实现决定的,而 客户端脚本(您提供的代码)仅负责发送请求和打印响应。具体原因如下:

1.1 后端服务的"黑箱"行为

在您的 FastAPI 后端代码中,这一行是关键:

python 复制代码
result = CrewtestprojectCrew(model).crew().kickoff(inputs=inputs)

这里的 CrewtestprojectCrew 是一个 LangChain CrewAI 的智能体团队,它的 kickoff() 方法可能默认包含以下隐藏行为:

  • 自动生成文件:CrewAI 的任务(Task)可以配置 output_file 参数(例如
    output_file="game.py"),导致生成的代码直接保存到文件。
  • 工作目录操作:智能体可能在当前工作目录(运行服务的目录)中创建文件,而无需客户端显式指定路径。
1.2 客户端脚本的局限性

您的客户端代码 仅处理API响应,没有文件写入逻辑:

python 复制代码
# 非流式输出
content = response.json()['choices'][0]['message']['content']
logger.info(f"非流式输出,响应内容是: {content}\n")  # 仅打印内容,未写入文件

如果游戏脚本文件自动生成,说明文件写入是由 后端服务 完成的。

项目代码地址:

https://github.com/NanGePlus/CrewAITest/tree/main/crewAIWithCoding

相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui