avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 自动化研发
文章

自动化研发

发表于 2026-08-27 更新于 2026-08- 27
作者 mdo
17~22 分钟 阅读

为了实现用 ThinkPHP 6 (TP6) + CrewAI 来自动编写业务代码,我们需要在 Python 端将 CrewAI 升级为一个“自动化研发团队”。这个团队至少需要两个角色:

  1. 高级系统架构师 (Architect):负责分析业务需求,设计数据库表结构和 API 接口规范。

  2. 高级 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');

请谨慎使用此类代码。


🚀 进阶玩法:如何让它更实用?

  1. 自动执行 SQL(闭环部署):在 receiveCode 方法中,接收到 package['sql'] 后,TP6 可以直接利用 Db::execute($package['sql']) 在数据库中建表,实现“建表 -> 编写代码 -> 注入系统”的全自动闭环。

  2. 添加“测试/纠错智能体” (Tester Agent):在 Python 端的 Crew 流程中,可以再加一个 高级测试工程师 角色。它的任务是去审查程序员写的代码是否有 Bug、是否漏掉了特定的业务逻辑,如果没有通过,则把代码退回给开发者重写(利用 CrewAI 的 Task 联动或条件分支),直到代码完美后再输出给 TP6。

技能加载完成。为了让智能体生成的代码百分之百契合您的项目,您可以告诉我:

  • 您的系统目前使用的是前后端分离(纯 API 格式输出),还是传统的 Blade/Twig/PHP 模板渲染?

  • 是否需要为 AI 开发团队配备具体的数据库规范(例如:必须包含 delete_time 软删除、主键必须使用 Snowflake 雪花算法等)?

  • 是否需要为您提供一个前端一键生成代码的控制台 UI 页面(包含需求输入框和生成进度条)?

技术
许可协议:  CC BY 4.0
分享

相关文章

10月 2, 2026

iOS 侧载(Sideloading)工具

AltStore 和 Sideloadly 都是目前最流行的 iOS 侧载(Sideloading)工具。 简单来说,它们的作用就是让你绕过苹果的官方 App Store,直接把第三方的 IPA 安装包(也就是 iOS 的应用安装文件)安装到你的 iPhone 或 iPad 上。 通过这两个工具,你

9月 28, 2026

注册 Chat Participant

将当前服务接入 VS Code 的 AI 聊天窗口是完全可行的。VS Code 在近期的版本中正式推出了 Chat Extensions API(github.copilot.chat),允许第三方扩展将自定义的 LLM 服务或工具注册到 Copilot Chat 面板中。 结合当前 code_ge

9月 23, 2026

php intelephense 设置 if 空格

在 VS Code 中,如果你使用的是 PHP Intelephense 插件,控制 if 关键字后面是否加空格的设置是由其内置的格式化引擎(基于 PSR-12 标准)决定的。 你可以通过修改 VS Code 的 settings.json 来配置这个行为: 1. 开启 if 后面的空格(默认/推荐

下一篇

Python 服务来实现多智能体协作

上一篇

可视化的 UI 控制台页面

最近更新

  • 比尔盖茨的智慧:想多赚钱,就每天循环做这3件事
  • iOS 侧载(Sideloading)工具
  • 程序员越想创业,越不要急着动手
  • 注册 Chat Participant
  • 中秋给在外游子的一封信

热门标签

API CodeGeex Coding Cursor DeepSeek Docker Gitkraken Harness Laravel Management

目录

©2026 mdo. 保留部分权利。