自动化研发
为了实现用 ThinkPHP 6 (TP6) + CrewAI 来自动编写业务代码,我们需要在 Python 端将 CrewAI 升级为一个“自动化研发团队”。这个团队至少需要两个角色:
高级系统架构师 (Architect):负责分析业务需求,设计数据库表结构和 API 接口规范。
高级 PHP 工程师 (Developer):根据架构设计,严格按照 TP6 的规范编写 Controller、Model 和 Validate 代码。
以下是为您构建的全自动业务代码生成器的完整实现方案。
第一步:Python 侧(构建 CrewAI 代码生成服务)
我们需要在 Python 中为智能体配备工具(如文件写入工具),并让它们协同工作,最后将生成的代码打包传回 TP6。
python
# filename: code_generator.py
from fastapi import FastAPI, BackgroundTasks
from pydantic import BaseModel
from crewai import Agent, Task, Crew, Process
import requests
import json
app = FastAPI()
class CodeGenerationRequest(BaseModel):
requirement: str # 用户输入的业务需求,如:“一个带有审核功能的博客系统”
callback_url: str # TP6 接收代码的回调地址
def run_coding_crew(requirement: str, callback_url: str):
# 1. 定义架构师智能体
architect = Agent(
role='高级系统架构师',
goal=f'将用户需求 "{requirement}" 转化为规范的数据库表结构和 API 接口设计',
backstory='你拥有10年以上的架构经验,精通 MySQL 性能优化和 RESTful API 设计规范。',
verbose=True
)
# 2. 定义 PHP 开发者智能体
php_developer = Agent(
role='高级 PHP 工程师',
goal='根据架构设计,编写符合 ThinkPHP 6.x 官方最佳实践的业务代码',
backstory='你是一名 TP6 专家。你写的代码极其规范,严格遵守 PSR-12 标准,坚决杜绝 SQL 注入,逻辑清晰,注释严谨。',
verbose=True
)
# 3. 架构师的任务:设计结构
task_design = Task(
description=f'分析需求:"{requirement}"。设计出所需的 MySQL 建表 SQL 语句,并规划好控制器中需要实现的 API 方法(如 index, save, read, update, delete)。',
expected_output='包含建表 SQL 和 API 接口规划的 Markdown 文档。',
agent=architect
)
# 4. 开发者的任务:写 TP6 代码
task_code = Task(
description='结合架构师的设计,编写标准的 ThinkPHP 6 业务代码。要求输出包含:'
'1. Controller(控制器代码,包含标准的 CRUD 逻辑与异常处理);'
'2. Model(模型代码,包含自动时间戳、软删除设置);'
'3. Validate(数据验证器代码,确保参数安全)。',
expected_output='JSON 格式的字符串,包含结构:{"sql": "...", "controller": "...", "model": "...", "validate": "..."}。注意:请只返回纯 JSON,不要包裹 ```json 标记。',
agent=php_developer
)
# 5. 组装团队(按顺序执行:先设计,后开发)
crew = Crew(
agents=[architect, php_developer],
tasks=[task_design, task_code],
process=Process.sequential
)
# 运行
raw_result = crew.kickoff()
# 6. 将结果清洗并回调给 TP6
try:
# 尝试解析智能体输出的 JSON
clean_result = json.loads(str(raw_result).strip())
except:
# 防止智能体未严格按格式输出,做兜底处理
clean_result = {"raw_output": str(raw_result)}
requests.post(callback_url, json={
"requirement": requirement,
"code_package": clean_result,
"status": "success"
})
@app.post("/api/v1/crew/generate-code")
def generate_code(data: CodeGenerationRequest, background_tasks: BackgroundTasks):
background_tasks.add_task(run_coding_crew, data.requirement, data.callback_url)
return {"code": 200, "msg": "代码生成任务已分发给 AI 开发团队,请稍候..."}
请谨慎使用此类代码。
第二步:ThinkPHP 6 侧(生成器的控制台)
在 TP6 中,我们接收到 AI 生成的代码后,可以直接在本地服务器对应的目录下创建真实的文件,实现真正的“全自动研发”。
1. 编写控制器代码 (app\controller\CodeFactory.php)
php
<?php
namespace app\controller;
use app\BaseController;
use think\facade\Http;
use think\facade\Log;
class CodeFactory extends BaseController
{
private $pythonServiceUrl = 'http://127.0.0';
/**
* 提交需求,让 CrewAI 开始写代码
* URL: http://your-domain/code_factory/submit
*/
public function submit()
{
// 接收业务需求描述
$requirement = $this->request->param('requirement', '创建一个商城商品管理模块,包含商品名称、价格、库存、状态、支持软删除和时间戳');
$callbackUrl = url('code_factory/receiveCode')->suffix(false)->domain(true)->build();
$response = Http::post($this->pythonServiceUrl, [
'requirement' => $requirement,
'callback_url' => $callbackUrl
]);
return json($response->json());
}
/**
* 接收 AI 编写好的代码,并自动写入 TP6 本地目录
* URL: http://your-domain/code_factory/receiveCode
*/
public function receiveCode()
{
$payload = $this->request->param();
Log::info('接收到 AI 编写的代码报文');
if (empty($payload) || !isset($payload['code_package'])) {
return json(['code' => 400, 'msg' => '无效的代码包']);
}
$package = $payload['code_package'];
// 假设我们要生成的模块名称叫 AutoGenerated (首字母大写)
$moduleName = 'Goods'; // 这里可以根据需求动态分析,暂以 Goods 为例
// 2. 自动写入 Model
if (!empty($package['model'])) {
$modelPath = root_path() . "app/model/{$moduleName}.php";
$this->writeFile($modelPath, $package['model']);
}
// 3. 自动写入 Validate
if (!empty($package['validate'])) {
$validatePath = root_path() . "app/validate/{$moduleName}Validate.php";
$this->writeFile($validatePath, $package['validate']);
}
// 1. 自动写入 Controller
if (!empty($package['controller'])) {
$controllerPath = root_path() . "app/controller/{$moduleName}.php";
$this->writeFile($controllerPath, $package['controller']);
}
// 4. 自动保存 SQL 脚本供开发者手动去数据库执行
if (!empty($package['sql'])) {
$sqlPath = root_path() . "runtime/{$moduleName}_install.sql";
$this->writeFile($sqlPath, $package['sql']);
}
return json(['code' => 200, 'msg' => '代码已自动注入到 TP6 系统对应目录!']);
}
/**
* 辅助方法:安全写入文件
*/
private function writeFile($filePath, $content)
{
$dir = dirname($filePath);
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
// 如果智能体输出带了 <?php 标记则直接写入,否则帮它加上
if (strpos($content, '<?php') === false && strpos($filePath, '.sql') === false) {
$content = "<?php\n" . $content;
}
file_put_contents($filePath, $content);
}
}
请谨慎使用此类代码。
第三步:路由与测试配置 (route\app.php)
php
use think\facade\Route;
// 触发代码生成器
Route::post('codegen/run', 'CodeFactory/submit');
// 接收代码回调
Route::post('codegen/callback', 'CodeFactory/receiveCode');
请谨慎使用此类代码。
🚀 进阶玩法:如何让它更实用?
自动执行 SQL(闭环部署):在
receiveCode方法中,接收到package['sql']后,TP6 可以直接利用Db::execute($package['sql'])在数据库中建表,实现“建表 -> 编写代码 -> 注入系统”的全自动闭环。添加“测试/纠错智能体” (Tester Agent):在 Python 端的 Crew 流程中,可以再加一个 高级测试工程师 角色。它的任务是去审查程序员写的代码是否有 Bug、是否漏掉了特定的业务逻辑,如果没有通过,则把代码退回给开发者重写(利用 CrewAI 的 Task 联动或条件分支),直到代码完美后再输出给 TP6。
技能加载完成。为了让智能体生成的代码百分之百契合您的项目,您可以告诉我:
您的系统目前使用的是前后端分离(纯 API 格式输出),还是传统的 Blade/Twig/PHP 模板渲染?
是否需要为 AI 开发团队配备具体的数据库规范(例如:必须包含
delete_time软删除、主键必须使用Snowflake雪花算法等)?是否需要为您提供一个前端一键生成代码的控制台 UI 页面(包含需求输入框和生成进度条)?