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

相关推荐
2501_915921431 天前
iOS App 电耗管理 通过系统电池记录、Xcode Instruments 与克魔(KeyMob)组合使用
android·ios·小程序·https·uni-app·iphone·webview
钱彬 (Qian Bin)1 天前
项目实践17—全球证件智能识别系统(开发基于LabelMe标注的可视化审核接口)
qt·fastapi·全球证件识别
June bug1 天前
【配环境】安卓项目开发环境
android
2501_944526421 天前
Flutter for OpenHarmony 万能游戏库App实战 - 蜘蛛纸牌游戏实现
android·java·python·flutter·游戏
csj501 天前
安卓基础之《(18)—内容提供者(4)在应用之间共享文件》
android
尤老师FPGA1 天前
使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第四十五讲)
android·java·ui
北辰当尹1 天前
xml基础
android·xml
龙之叶1 天前
【Android Monkey源码解析四】- 异常捕获/页面控制
android·windows·adb·monkey
_F_y2 天前
MySQL表的操作
android·数据库·mysql
yngsqq2 天前
AndroidStudio汉化步骤
android