• 正文
  • 相关推荐
申请入驻 产业图谱

十分钟实用教程 | vibe必备—前后端Agent开发工具完整指南(下)

06/09 13:48
Image1304
加入交流群
Image 扫码加入
获取工程师必备礼包
参与热点资讯讨论

转载自公众号:敢敢AUTOHUB

5. 认证工具

5.1 OAuth 2.0 vs JWT vs 现代认证方案

认证机制确保用户身份验证,防止未授权访问。OAuth 2.0是标准协议,支持第三方登录如GitHub认证。JWT(JSON Web Tokens)用于无状态认证,携带声明信息,便于API安全。

Image

5.1.1 完整OAuth 2.0实现示例
// OAuth 2.0 完整实现 (Express.js + GitHub)
const express = require('express');
const session = require('express-session');
const crypto = require('crypto');
const axios = require('axios');

const app = express();

// 配置session
app.use(session({
  secret: process.env.SESSION_SECRET,
  resave: false,
  saveUninitialized: false,
  cookie: {
    secure: process.env.NODE_ENV === 'production',
    httpOnly: true,
    maxAge: 24 * 60 * 60 * 1000 // 24小时
  }
}));

// OAuth配置
const GITHUB_CONFIG = {
  client_id: process.env.GITHUB_CLIENT_ID,
  client_secret: process.env.GITHUB_CLIENT_SECRET,
  redirect_uri: process.env.GITHUB_REDIRECT_URI,
  scope: 'user:email read:org'
};

// 1. 初始化OAuth流程
app.get('/auth/github', (req, res) => {
  // 生成状态参数防止CSRF攻击
  const state = crypto.randomBytes(32).toString('hex');
  req.session.oauth_state = state;

  // PKCE for OAuth2 (可选,增强安全性)
  const codeVerifier = crypto.randomBytes(32).toString('base64url');
  const codeChallenge = crypto
    .createHash('sha256')
    .update(codeVerifier)
    .digest('base64url');

  req.session.code_verifier = codeVerifier;

  const authUrl = new URL('<https://github.com/login/oauth/authorize>');
  authUrl.searchParams.set('client_id', GITHUB_CONFIG.client_id);
  authUrl.searchParams.set('redirect_uri', GITHUB_CONFIG.redirect_uri);
  authUrl.searchParams.set('scope', GITHUB_CONFIG.scope);
  authUrl.searchParams.set('state', state);
  authUrl.searchParams.set('code_challenge', codeChallenge);
  authUrl.searchParams.set('code_challenge_method', 'S256');

  res.redirect(authUrl.toString());
});

// 2. 处理OAuth回调
app.get('/auth/github/callback', async (req, res) => {
  const { code, state, error } = req.query;

  // 检查错误
  if (error) {
    return res.status(400).json({
      error: 'OAuth授权失败',
      description: error
    });
  }

  // 验证state参数
  if (!state || state !== req.session.oauth_state) {
    return res.status(400).json({
      error: 'State参数不匹配',
      description: '可能的CSRF攻击'
    });
  }

  // 清除session中的state
  delete req.session.oauth_state;

  try {
    // 3. 交换access token
    const tokenResponse = await axios.post('<https://github.com/login/oauth/access_token>', {
      client_id: GITHUB_CONFIG.client_id,
      client_secret: GITHUB_CONFIG.client_secret,
      code: code,
      redirect_uri: GITHUB_CONFIG.redirect_uri,
      code_verifier: req.session.code_verifier // PKCE
    }, {
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      }
    });

    const { access_token, token_type, scope } = tokenResponse.data;

    if (!access_token) {
      throw new Error('未收到访问令牌');
    }

    // 4. 获取用户信息
    const [userResponse, emailResponse] = await Promise.all([
      axios.get('<https://api.github.com/user>', {
        headers: {
          'Authorization': `${token_type} ${access_token}`,
          'Accept': 'application/vnd.github.v3+json'
        }
      }),
      axios.get('<https://api.github.com/user/emails>', {
        headers: {
          'Authorization': `${token_type} ${access_token}`,
          'Accept': 'application/vnd.github.v3+json'
        }
      })
    ]);

    const user = userResponse.data;
    const emails = emailResponse.data;
    const primaryEmail = emails.find(email => email.primary && email.verified);

    // 5. 创建/更新用户记录
    const userData = {
      github_id: user.id,
      username: user.login,
      email: primaryEmail?.email,
      name: user.name,
      avatar_url: user.avatar_url,
      github_profile: user.html_url,
      access_token: access_token, // 生产环境中应加密存储
      token_scope: scope,
      last_login: new Date(),
      updated_at: new Date()
    };

    // 保存到数据库(这里使用伪代码)
    const dbUser = await User.findOneAndUpdate(
      { github_id: user.id },
      userData,
      { upsert: true, new: true }
    );

    // 6. 创建用户session
    req.session.user = {
      id: dbUser._id,
      username: dbUser.username,
      email: dbUser.email,
      avatar_url: dbUser.avatar_url
    };

    // 清理临时数据
    delete req.session.code_verifier;

    res.redirect('/dashboard?auth=success');

  } catch (error) {
    console.error('OAuth处理错误:', error.response?.data || error.message);
    res.status(500).json({
      error: '认证处理失败',
      description: error.message
    });
  }
});

// 7. 获取当前用户信息
app.get('/api/user/profile', async (req, res) => {
  if (!req.session.user) {
    return res.status(401).json({ error: '未认证' });
  }

  try {
    const user = await User.findById(req.session.user.id);
    if (!user) {
      return res.status(404).json({ error: '用户不存在' });
    }

    // 同步GitHub数据(可选)
    if (user.access_token) {
      try {
        const githubResponse = await axios.get('<https://api.github.com/user>', {
          headers: {
            'Authorization': `token ${user.access_token}`,
            'Accept': 'application/vnd.github.v3+json'
          }
        });

        // 更新用户数据
        await User.findByIdAndUpdate(user._id, {
          name: githubResponse.data.name,
          avatar_url: githubResponse.data.avatar_url,
          github_followers: githubResponse.data.followers,
          github_following: githubResponse.data.following,
          github_public_repos: githubResponse.data.public_repos
        });
      } catch (githubError) {
        console.log('GitHub API调用失败:', githubError.message);
      }
    }

    res.json({
      id: user._id,
      username: user.username,
      email: user.email,
      name: user.name,
      avatar_url: user.avatar_url,
      github_profile: user.github_profile,
      github_stats: {
        followers: user.github_followers,
        following: user.github_following,
        public_repos: user.github_public_repos
      },
      last_login: user.last_login,
      created_at: user.created_at
    });
  } catch (error) {
    res.status(500).json({ error: '获取用户信息失败' });
  }
});

// 8. 撤销token并登出
app.post('/auth/logout', async (req, res) => {
  if (req.session.user) {
    try {
      const user = await User.findById(req.session.user.id);

      // 撤销GitHub访问令牌
      if (user.access_token) {
        await axios.delete(`https://api.github.com/applications/${GITHUB_CONFIG.client_id}/token`, {
          auth: {
            username: GITHUB_CONFIG.client_id,
            password: GITHUB_CONFIG.client_secret
          },
          data: {
            access_token: user.access_token
          }
        });

        // 清除数据库中的token
        await User.findByIdAndUpdate(user._id, {
          access_token: null,
          token_scope: null
        });
      }
    } catch (error) {
      console.error('Token撤销失败:', error.message);
    }
  }

  req.session.destroy((err) => {
    if (err) {
      return res.status(500).json({ error: '登出失败' });
    }
    res.clearCookie('connect.sid');
    res.json({ message: '成功登出' });
  });
});

module.exports = app;
5.1.2 JWT高级实现示例

Image

// JWT高级认证系统
const jwt = require('jsonwebtoken');
const crypto = require('crypto');
const bcrypt = require('bcrypt');

class JWTAuthService {
  constructor() {
    this.accessTokenSecret = process.env.JWT_ACCESS_SECRET;
    this.refreshTokenSecret = process.env.JWT_REFRESH_SECRET;
    this.accessTokenExpiry = '15m';
    this.refreshTokenExpiry = '7d';
    this.refreshTokens = new Set(); // 生产环境使用Redis
  }

  // 1. 生成令牌对
  generateTokenPair(payload) {
    const accessToken = jwt.sign(
      payload,
      this.accessTokenSecret,
      {
        expiresIn: this.accessTokenExpiry,
        issuer: 'your-app',
        audience: 'your-app-users',
        algorithm: 'HS256'
      }
    );

    const refreshToken = jwt.sign(
      {
        userId: payload.userId,
        tokenId: crypto.randomUUID() // 唯一标识符
      },
      this.refreshTokenSecret,
      {
        expiresIn: this.refreshTokenExpiry,
        issuer: 'your-app',
        audience: 'your-app-users',
        algorithm: 'HS256'
      }
    );

    // 存储refresh token
    this.refreshTokens.add(refreshToken);

    return {
      accessToken,
      refreshToken,
      accessTokenExpiresIn: 15 * 60, // 15分钟(秒)
      refreshTokenExpiresIn: 7 * 24 * 60 * 60, // 7天(秒)
      tokenType: 'Bearer'
    };
  }

  // 2. 验证访问令牌
  verifyAccessToken(token) {
    try {
      const decoded = jwt.verify(token, this.accessTokenSecret, {
        issuer: 'your-app',
        audience: 'your-app-users'
      });
      return { valid: true, decoded };
    } catch (error) {
      return {
        valid: false,
        error: error.name,
        message: error.message
      };
    }
  }

  // 3. 刷新令牌
  refreshAccessToken(refreshToken) {
    try {
      // 验证refresh token
      const decoded = jwt.verify(refreshToken, this.refreshTokenSecret, {
        issuer: 'your-app',
        audience: 'your-app-users'
      });

      // 检查token是否在白名单中
      if (!this.refreshTokens.has(refreshToken)) {
        throw new Error('Refresh token已被撤销');
      }

      // 移除旧的refresh token
      this.refreshTokens.delete(refreshToken);

      // 生成新的令牌对
      const newTokens = this.generateTokenPair({
        userId: decoded.userId,
        // 这里可以添加更多用户信息
      });

      return { success: true, tokens: newTokens };
    } catch (error) {
      return {
        success: false,
        error: error.message
      };
    }
  }

  // 4. 撤销refresh token
  revokeRefreshToken(refreshToken) {
    this.refreshTokens.delete(refreshToken);
  }

  // 5. 撤销用户所有token
  revokeAllUserTokens(userId) {
    // 在生产环境中,这需要查询Redis并删除所有该用户的tokens
    for (const token of this.refreshTokens) {
      try {
        const decoded = jwt.verify(token, this.refreshTokenSecret);
        if (decoded.userId === userId) {
          this.refreshTokens.delete(token);
        }
      } catch (error) {
        // Token已过期或无效,跳过
      }
    }
  }
}

// Express中间件
function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];

  if (!token) {
    return res.status(401).json({
      error: 'Access token required',
      code: 'TOKEN_MISSING'
    });
  }

  const authService = new JWTAuthService();
  const result = authService.verifyAccessToken(token);

  if (!result.valid) {
    const statusCode = result.error === 'TokenExpiredError' ? 401 : 403;
    return res.status(statusCode).json({
      error: 'Invalid or expired token',
      code: result.error,
      message: result.message
    });
  }

  req.user = result.decoded;
  next();
}

// 使用示例
const express = require('express');
const app = express();
const authService = new JWTAuthService();

app.use(express.json());

// 登录端点
app.post('/auth/login', async (req, res) => {
  const { email, password } = req.body;

  try {
    // 验证用户凭据
    const user = await User.findOne({ email });
    if (!user || !await bcrypt.compare(password, user.password)) {
      return res.status(401).json({
        error: '邮箱或密码错误'
      });
    }

    // 生成令牌
    const tokens = authService.generateTokenPair({
      userId: user._id,
      email: user.email,
      role: user.role
    });

    // 更新最后登录时间
    await User.findByIdAndUpdate(user._id, {
      last_login: new Date()
    });

    res.json({
      message: '登录成功',
      user: {
        id: user._id,
        email: user.email,
        name: user.name,
        role: user.role
      },
      ...tokens
    });
  } catch (error) {
    res.status(500).json({
      error: '登录处理失败',
      message: error.message
    });
  }
});

// 刷新令牌端点
app.post('/auth/refresh', (req, res) => {
  const { refreshToken } = req.body;

  if (!refreshToken) {
    return res.status(401).json({
      error: 'Refresh token required'
    });
  }

  const result = authService.refreshAccessToken(refreshToken);

  if (!result.success) {
    return res.status(401).json({
      error: 'Invalid refresh token',
      message: result.error
    });
  }

  res.json({
    message: '令牌刷新成功',
    ...result.tokens
  });
});

// 保护的路由
app.get('/api/protected', authenticateToken, (req, res) => {
  res.json({
    message: '这是受保护的资源',
    user: req.user,
    timestamp: new Date().toISOString()
  });
});

// 登出端点
app.post('/auth/logout', authenticateToken, (req, res) => {
  const { refreshToken } = req.body;

  if (refreshToken) {
    authService.revokeRefreshToken(refreshToken);
  }

  res.json({
    message: '成功登出'
  });
});

// 撤销所有设备登录
app.post('/auth/logout-all', authenticateToken, (req, res) => {
  authService.revokeAllUserTokens(req.user.userId);

  res.json({
    message: '已登出所有设备'
  });
});

module.exports = { JWTAuthService, authenticateToken };
5.1.3 现代认证方案对比
认证方案 安全性 复杂度 性能 扩展性 适用场景
Session Cookies 传统Web应用
JWT API服务
OAuth 2.0 第三方集成
WebAuthn 极高 无密码认证
SAML 极高 企业SSO

6. 存储工具

6.1 对象存储 vs 文件系统 vs CDN

存储解决方案处理文件和对象管理,确保数据持久性和访问速度。AWS S3提供对象存储,支持版本控制和生命周期管理。Cloudflare R2兼容S3 API,无出口费用,适合全球分发。

Image

6.1.1 S3高级功能实现
// AWS S3高级存储管理
const AWS = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');
const sharp = require('sharp');
const crypto = require('crypto');

// 配置AWS
const s3 = new AWS.S3({
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  region: process.env.AWS_REGION
});

class S3StorageService {
  constructor(bucketName) {
    this.bucketName = bucketName;
    this.cloudFrontDomain = process.env.CLOUDFRONT_DOMAIN;
  }

  // 1. 直接上传配置
  getMulterUpload() {
    return multer({
      storage: multerS3({
        s3: s3,
        bucket: this.bucketName,
        acl: 'private', // 默认私有访问
        key: (req, file, cb) => {
          const fileExtension = file.originalname.split('.').pop();
          const fileName = `${Date.now()}-${crypto.randomUUID()}.${fileExtension}`;
          cb(null, `uploads/${fileName}`);
        },
        metadata: (req, file, cb) => {
          cb(null, {
            uploadedBy: req.user?.id || 'anonymous',
            originalName: file.originalname,
            uploadedAt: new Date().toISOString()
          });
        },
        contentType: multerS3.AUTO_CONTENT_TYPE
      }),
      limits: {
        fileSize: 50 * 1024 * 1024 // 50MB限制
      },
      fileFilter: (req, file, cb) => {
        // 文件类型验证
        const allowedTypes = ['image/jpeg', 'image/png', 'image/webp', 'application/pdf'];
        if (allowedTypes.includes(file.mimetype)) {
          cb(null, true);
        } else {
          cb(new Error('不支持的文件类型'), false);
        }
      }
    });
  }

  // 2. 多尺寸图片处理和上传
  async uploadImageWithVariants(file, variants = []) {
    const baseKey = `images/${Date.now()}-${crypto.randomUUID()}`;
    const results = {};

    try {
      // 原图上传
      const originalKey = `${baseKey}/original.${file.originalname.split('.').pop()}`;
      await this.uploadBuffer(file.buffer, originalKey, file.mimetype);
      results.original = this.getPublicUrl(originalKey);

      // 生成不同尺寸变体
      for (const variant of variants) {
        const { name, width, height, quality = 85 } = variant;

        const processedBuffer = await sharp(file.buffer)
          .resize(width, height, {
            fit: 'cover',
            position: 'center'
          })
          .jpeg({ quality })
          .toBuffer();

        const variantKey = `${baseKey}/${name}.jpg`;
        await this.uploadBuffer(processedBuffer, variantKey, 'image/jpeg');
        results[name] = this.getPublicUrl(variantKey);
      }

      return {
        success: true,
        variants: results,
        baseKey: baseKey
      };
    } catch (error) {
      throw new Error(`图片处理失败: ${error.message}`);
    }
  }

  // 3. 预签名URL生成(安全上传)
  generatePresignedUploadUrl(key, contentType, expiresIn = 3600) {
    const params = {
      Bucket: this.bucketName,
      Key: key,
      Expires: expiresIn,
      ContentType: contentType,
      Conditions: [
        ['content-length-range', 0, 50 * 1024 * 1024], // 最大50MB
        ['starts-with', '$Content-Type', contentType.split('/')[0]]
      ]
    };

    return new Promise((resolve, reject) => {
      s3.createPresignedPost(params, (err, data) => {
        if (err) reject(err);
        else resolve(data);
      });
    });
  }

  // 4. 预签名下载URL(私有文件访问)
  generatePresignedDownloadUrl(key, expiresIn = 3600) {
    const params = {
      Bucket: this.bucketName,
      Key: key,
      Expires: expiresIn
    };

    return s3.getSignedUrl('getObject', params);
  }

  // 5. 生命周期管理
  async setupLifecyclePolicy() {
    const lifecycleConfiguration = {
      Bucket: this.bucketName,
      LifecycleConfiguration: {
        Rules: [
          {
            ID: 'DeleteIncompleteMultipartUploads',
            Status: 'Enabled',
            AbortIncompleteMultipartUpload: {
              DaysAfterInitiation: 1
            }
          },
          {
            ID: 'TransitionToIA',
            Status: 'Enabled',
            Transition: {
              Days: 30,
              StorageClass: 'STANDARD_IA'
            }
          },
          {
            ID: 'TransitionToGlacier',
            Status: 'Enabled',
            Transition: {
              Days: 90,
              StorageClass: 'GLACIER'
            }
          },
          {
            ID: 'DeleteOldVersions',
            Status: 'Enabled',
            NoncurrentVersionExpiration: {
              NoncurrentDays: 30
            }
          }
        ]
      }
    };

    return s3.putBucketLifecycleConfiguration(lifecycleConfiguration).promise();
  }

  // 6. 批量操作
  async batchDelete(keys) {
    const deleteParams = {
      Bucket: this.bucketName,
      Delete: {
        Objects: keys.map(key => ({ Key: key })),
        Quiet: false
      }
    };

    return s3.deleteObjects(deleteParams).promise();
  }

  // 7. 文件同步和备份
  async syncToBackupBucket(backupBucketName) {
    const listParams = {
      Bucket: this.bucketName
    };

    const objects = await s3.listObjectsV2(listParams).promise();
    const syncPromises = objects.Contents.map(async (object) => {
      const copyParams = {
        Bucket: backupBucketName,
        CopySource: `${this.bucketName}/${object.Key}`,
        Key: object.Key
      };

      return s3.copyObject(copyParams).promise();
    });

    return Promise.all(syncPromises);
  }

  // 辅助方法
  async uploadBuffer(buffer, key, contentType) {
    const params = {
      Bucket: this.bucketName,
      Key: key,
      Body: buffer,
      ContentType: contentType,
      ACL: 'private'
    };

    return s3.upload(params).promise();
  }

  getPublicUrl(key) {
    if (this.cloudFrontDomain) {
      return `https://${this.cloudFrontDomain}/${key}`;
    }
    return `https://${this.bucketName}.s3.${process.env.AWS_REGION}.amazonaws.com/${key}`;
  }

  // 8. 使用统计
  async getStorageUsage() {
    const listParams = {
      Bucket: this.bucketName
    };

    const objects = await s3.listObjectsV2(listParams).promise();

    const totalSize = objects.Contents.reduce((sum, obj) => sum + obj.Size, 0);
    const objectCount = objects.Contents.length;

    // 按文件类型分组
    const typeStats = objects.Contents.reduce((stats, obj) => {
      const extension = obj.Key.split('.').pop().toLowerCase();
      if (!stats[extension]) {
        stats[extension] = { count: 0, size: 0 };
      }
      stats[extension].count++;
      stats[extension].size += obj.Size;
      return stats;
    }, {});

    return {
      totalSize: totalSize,
      totalObjects: objectCount,
      averageSize: totalSize / objectCount,
      typeBreakdown: typeStats,
      formattedSize: this.formatBytes(totalSize)
    };
  }

  formatBytes(bytes) {
    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
    if (bytes === 0) return '0 Bytes';
    const i = Math.floor(Math.log(bytes) / Math.log(1024));
    return Math.round(bytes / Math.pow(1024, i) * 100) / 100 + ' ' + sizes[i];
  }
}

// Express路由示例
const express = require('express');
const router = express.Router();
const storage = new S3StorageService(process.env.S3_BUCKET_NAME);

// 文件上传路由
router.post('/upload', storage.getMulterUpload().single('file'), (req, res) => {
  if (!req.file) {
    return res.status(400).json({ error: '没有上传文件' });
  }

  res.json({
    success: true,
    file: {
      key: req.file.key,
      location: req.file.location,
      size: req.file.size,
      contentType: req.file.contentType
    }
  });
});

// 图片多尺寸上传
router.post('/upload-image', multer().single('image'), async (req, res) => {
  try {
    const variants = [
      { name: 'thumbnail', width: 150, height: 150 },
      { name: 'medium', width: 500, height: 500 },
      { name: 'large', width: 1200, height: 1200 }
    ];

    const result = await storage.uploadImageWithVariants(req.file, variants);
    res.json(result);
  } catch (error) {
    res.status(500).json({
      error: '图片上传失败',
      message: error.message
    });
  }
});

// 获取预签名上传URL
router.post('/presigned-upload-url', (req, res) => {
  const { fileName, contentType } = req.body;
  const key = `uploads/${Date.now()}-${fileName}`;

  storage.generatePresignedUploadUrl(key, contentType)
    .then(data => res.json(data))
    .catch(error => res.status(500).json({ error: error.message }));
});

// 获取存储使用统计
router.get('/storage-stats', async (req, res) => {
  try {
    const stats = await storage.getStorageUsage();
    res.json(stats);
  } catch (error) {
    res.status(500).json({
      error: '获取存储统计失败',
      message: error.message
    });
  }
});

module.exports = router;
6.1.2 存储方案对比表
存储类型 延迟 成本 可扩展性 持久性 适用场景
AWS S3 无限 99.999999999% 通用对象存储
Cloudflare R2 极低 99.999999999% 全球CDN
Google Cloud Storage 无限 99.999999999% 企业级存储
Azure Blob Storage 无限 99.999999999% 混合云存储
本地文件系统 极低 有限 取决于硬件 开发环境

7. Agent开发工具

7.1 AgentScope vs LangChain vs CrewAI 对比

Agent框架支持构建AI代理,实现自主任务执行。AgentScope由阿里巴巴开发,用于多代理模拟,支持分布式协作和自定义工具。

7.1.1 AgentScope多代理协作示例

Image

# AgentScope多代理协作系统
import agentscope
from agentscope.agents import DialogAgent, UserAgent
from agentscope.memory import TemporaryMemory
from agentscope.message import Msg
from agentscope.service import execute_python_code, web_search, send_email
import asyncio
from typing import List, Dict, Any

# 1. 配置模型
agentscope.init(
    model_configs=[
        {
            "model_type": "openai_chat",
            "config_name": "gpt-4",
            "model_name": "gpt-4-turbo-preview",
            "api_key": "your-api-key",
            "organization": "your-org-id"
        },
        {
            "model_type": "openai_chat",
            "config_name": "gpt-3.5",
            "model_name": "gpt-3.5-turbo",
            "api_key": "your-api-key"
        }
    ],
    project="multi_agent_system",
    save_dir="./logs"
)

class ProjectManagerAgent(DialogAgent):
    """项目管理代理 - 协调其他代理完成复杂任务"""

    def __init__(self, name: str = "ProjectManager"):
        super().__init__(
            name=name,
            model_config_name="gpt-4",
            sys_prompt="""你是一个项目管理代理,负责:
            1. 分解复杂任务为子任务
            2. 分配任务给适当的专业代理
            3. 监控任务进度
            4. 协调代理间的协作
            5. 整合最终结果

            可用的专业代理:
            - ResearchAgent: 研究和信息收集
            - DeveloperAgent: 代码开发和技术实现
            - QAAgent: 质量保证和测试
            - DeploymentAgent: 部署和运维
            """
        )
        self.task_queue = []
        self.completed_tasks = []
        self.agent_status = {}

    async def coordinate_project(self, project_description: str, available_agents: List[DialogAgent]):
        """协调项目执行"""
        # 1. 任务分解
        breakdown_prompt = f"""
        项目描述: {project_description}

        请将此项目分解为具体的子任务,每个任务应该:
        1. 有明确的目标和交付物
        2. 指定负责的代理类型
        3. 列出依赖关系
        4. 估算完成时间

        输出格式为JSON:
        {{
            "tasks": [
                {{
                    "id": "task_1",
                    "title": "任务标题",
                    "description": "详细描述",
                    "agent_type": "AgentType",
                    "dependencies": ["task_id"],
                    "estimated_hours": 4,
                    "priority": "high"
                }}
            ]
        }}
        """

        breakdown_msg = Msg(self.name, breakdown_prompt, role="user")
        breakdown_response = self(breakdown_msg)

        # 解析任务
        import json
        try:
            tasks_data = json.loads(breakdown_response.content)
            self.task_queue = tasks_data["tasks"]
        except:
            # 如果解析失败,创建默认任务
            self.task_queue = [
                {
                    "id": "research",
                    "title": "项目研究",
                    "description": f"研究项目: {project_description}",
                    "agent_type": "ResearchAgent",
                    "dependencies": [],
                    "priority": "high"
                }
            ]

        # 2. 执行任务
        results = []
        for task in self.task_queue:
            agent = self.find_agent_by_type(task["agent_type"], available_agents)
            if agent:
                result = await self.execute_task(task, agent)
                results.append(result)
                self.completed_tasks.append({**task, "result": result})

        # 3. 整合结果
        final_report = await self.generate_final_report(results)
        return final_report

    def find_agent_by_type(self, agent_type: str, agents: List[DialogAgent]):
        """根据类型查找代理"""
        for agent in agents:
            if agent.__class__.__name__ == agent_type:
                return agent
        return None

    async def execute_task(self, task: Dict, agent: DialogAgent):
        """执行单个任务"""
        task_msg = Msg(
            self.name,
            f"任务: {task['title']}\n描述: {task['description']}\n请完成此任务并提供详细结果。",
            role="user"
        )

        response = agent(task_msg)
        return {
            "task_id": task["id"],
            "result": response.content,
            "agent": agent.name,
            "status": "completed"
        }

    async def generate_final_report(self, results: List[Dict]):
        """生成最终报告"""
        report_prompt = f"""
        基于以下任务执行结果,生成项目完成报告:

        {json.dumps(results, indent=2, ensure_ascii=False)}

        报告应包括:
        1. 项目概述
        2. 主要成果
        3. 技术实现细节
        4. 质量保证结果
        5. 部署状态
        6. 后续建议
        """

        report_msg = Msg(self.name, report_prompt, role="user")
        return self(report_msg).content

class ResearchAgent(DialogAgent):
    """研究代理 - 负责信息收集和分析"""

    def __init__(self, name: str = "Researcher"):
        super().__init__(
            name=name,
            model_config_name="gpt-4",
            sys_prompt="""你是一个专业的研究代理,擅长:
            1. 网络信息搜索和收集
            2. 技术趋势分析
            3. 竞品调研
            4. 技术方案比较
            5. 可行性分析

            你可以使用网络搜索工具获取最新信息。
            """
        )

    def research_topic(self, topic: str) -> Dict[str, Any]:
        """研究特定主题"""
        # 使用网络搜索服务
        search_results = web_search(f"{topic} 最新技术 2024")

        analysis_prompt = f"""
        研究主题: {topic}
        搜索结果: {search_results}

        请提供深入分析,包括:
        1. 技术现状
        2. 主要解决方案
        3. 优缺点比较
        4. 最佳实践
        5. 实施建议
        """

        analysis_msg = Msg(self.name, analysis_prompt, role="user")
        return self(analysis_msg).content

class DeveloperAgent(DialogAgent):
    """开发代理 - 负责代码实现"""

    def __init__(self, name: str = "Developer"):
        super().__init__(
            name=name,
            model_config_name="gpt-4",
            sys_prompt="""你是一个高级开发代理,专精于:
            1. 代码架构设计
            2. 算法实现
            3. 性能优化
            4. 代码重构
            5. 技术选型

            你可以执行Python代码来验证实现。
            """
        )

    def implement_feature(self, requirement: str, tech_stack: str) -> Dict[str, Any]:
        """实现功能需求"""
        design_prompt = f"""
        需求: {requirement}
        技术栈: {tech_stack}

        请设计并实现此功能,包括:
        1. 架构设计
        2. 核心代码实现
        3. 关键算法
        4. 错误处理
        5. 性能考虑
        """

        design_msg = Msg(self.name, design_prompt, role="user")
        code_design = self(design_msg).content

        # 执行代码验证
        try:
            code_block = self.extract_code_block(code_design)
            if code_block:
                execution_result = execute_python_code(code_block)
                return {
                    "design": code_design,
                    "execution_result": execution_result,
                    "status": "success"
                }
        except Exception as e:
            return {
                "design": code_design,
                "execution_error": str(e),
                "status": "needs_review"
            }

        return {"design": code_design, "status": "completed"}

    def extract_code_block(self, text: str) -> str:
        """提取代码块"""
        import re
        code_pattern = r'```python\n(.*?)\n```'
        matches = re.findall(code_pattern, text, re.DOTALL)
        return matches[0] if matches else None

class QAAgent(DialogAgent):
    """质量保证代理 - 负责测试和验证"""

    def __init__(self, name: str = "QAEngineer"):
        super().__init__(
            name=name,
            model_config_name="gpt-3.5",
            sys_prompt="""你是一个专业的QA代理,专注于:
            1. 测试用例设计
            2. 自动化测试实现
            3. 性能测试
            4. 安全测试
            5. 代码质量评估
            """
        )

    def create_test_suite(self, code: str, requirements: str) -> Dict[str, Any]:
        """创建测试套件"""
        test_prompt = f"""
        代码: {code}
        需求: {requirements}

        请创建全面的测试套件,包括:
        1. 单元测试
        2. 集成测试
        3. 边界条件测试
        4. 错误处理测试
        5. 性能测试
        """

        test_msg = Msg(self.name, test_prompt, role="user")
        test_suite = self(test_msg).content

        # 执行测试
        try:
            test_code = self.extract_test_code(test_suite)
            if test_code:
                test_result = execute_python_code(test_code)
                return {
                    "test_suite": test_suite,
                    "test_result": test_result,
                    "status": "passed"
                }
        except Exception as e:
            return {
                "test_suite": test_suite,
                "test_error": str(e),
                "status": "failed"
            }

        return {"test_suite": test_suite, "status": "created"}

    def extract_test_code(self, text: str) -> str:
        """提取测试代码"""
        import re
        test_pattern = r'```python\n(.*?)\n```'
        matches = re.findall(test_pattern, text, re.DOTALL)
        return matches[0] if matches else None

# 使用示例
async def main():
    # 创建代理团队
    project_manager = ProjectManagerAgent()
    researcher = ResearchAgent()
    developer = DeveloperAgent()
    qa_engineer = QAAgent()

    agents = [researcher, developer, qa_engineer]

    # 定义项目
    project_description = """
    开发一个智能聊天机器人系统,要求:
    1. 支持多轮对话
    2. 集成外部API
    3. 具备学习能力
    4. 部署到云平台
    5. 提供API接口
    """

    # 执行项目
    try:
        final_report = await project_manager.coordinate_project(
            project_description,
            agents
        )

        print("项目完成报告:")
        print("=" * 50)
        print(final_report)

        # 发送报告邮件
        send_email(
            to="stakeholder@company.com",
            subject="智能聊天机器人项目完成报告",
            body=final_report
        )

    except Exception as e:
        print(f"项目执行出错: {e}")

if __name__ == "__main__":
    asyncio.run(main())
7.1.2 CrewAI团队协作示例

Image

# CrewAI团队协作系统
from crewai import Agent, Task, Crew, Process
from crewai.tools import SerperDevTool, CodeDocsSearchTool, CodeInterpreterTool
from langchain.llms import OpenAI
from langchain.tools import Tool
import os

# 配置LLM
llm = OpenAI(
    openai_api_key=os.getenv("OPENAI_API_KEY"),
    model_name="gpt-4",
    temperature=0.1
)

# 自定义工具
class DatabaseQueryTool:
    @staticmethod
    def run(query: str) -> str:
        """模拟数据库查询工具"""
        # 实际实现中这里会连接真实数据库
        return f"数据库查询结果: {query}"

class DeploymentTool:
    @staticmethod
    def deploy(service_name: str, environment: str) -> str:
        """模拟部署工具"""
        return f"已将 {service_name} 部署到 {environment} 环境"

# 创建工具实例
search_tool = SerperDevTool()
code_search_tool = CodeDocsSearchTool()
code_interpreter = CodeInterpreterTool()
db_tool = Tool(
    name="Database Query",
    description="查询数据库获取信息",
    func=DatabaseQueryTool.run
)
deploy_tool = Tool(
    name="Deployment Tool",
    description="部署服务到指定环境",
    func=DeploymentTool.deploy
)

# 1. 产品经理代理
product_manager = Agent(
    role='产品经理',
    goal='定义产品需求并确保项目符合业务目标',
    backstory="""你是一位经验丰富的产品经理,擅长需求分析、
    产品规划和跨团队协作。你对市场趋势有深入洞察,
    能够平衡用户需求和技术可行性。""",
    verbose=True,
    allow_delegation=True,
    llm=llm,
    tools=[search_tool, db_tool]
)

# 2. 架构师代理
tech_lead = Agent(
    role='技术架构师',
    goal='设计可扩展、高性能的系统架构',
    backstory="""你是一位资深的技术架构师,拥有10年以上的
    大型系统设计经验。你精通微服务架构、云原生技术,
    能够设计出高可用、可扩展的系统。""",
    verbose=True,
    allow_delegation=True,
    llm=llm,
    tools=[search_tool, code_search_tool]
)

# 3. 高级开发工程师代理
senior_developer = Agent(
    role='高级开发工程师',
    goal='实现高质量的代码和核心功能',
    backstory="""你是一位技术精湛的高级开发工程师,
    精通多种编程语言和框架。你注重代码质量,
    擅长性能优化和系统集成。""",
    verbose=True,
    allow_delegation=False,
    llm=llm,
    tools=[code_interpreter, code_search_tool]
)

# 4. DevOps工程师代理
devops_engineer = Agent(
    role='DevOps工程师',
    goal='确保系统的可靠部署和运维',
    backstory="""你是一位专业的DevOps工程师,
    精通CI/CD、容器化技术和云平台运维。
    你能够构建自动化的部署流水线。""",
    verbose=True,
    allow_delegation=False,
    llm=llm,
    tools=[deploy_tool, search_tool]
)

# 5. QA工程师代理
qa_engineer = Agent(
    role='QA工程师',
    goal='确保产品质量和用户体验',
    backstory="""你是一位细致专业的QA工程师,
    擅长测试策略设计、自动化测试和质量保证。
    你有敏锐的质量意识和丰富的测试经验。""",
    verbose=True,
    allow_delegation=False,
    llm=llm,
    tools=[code_interpreter, search_tool]
)

# 定义任务
task1 = Task(
    description="""分析电商平台推荐系统的需求:
    1. 研究市场上主流推荐算法
    2. 分析用户行为数据需求
    3. 定义核心功能和性能指标
    4. 制定项目时间线和里程碑
    5. 识别潜在风险和解决方案

    输出应包含详细的需求规范文档。""",
    agent=product_manager,
    expected_output="详细的产品需求规范文档"
)

task2 = Task(
    description="""基于产品需求设计系统架构:
    1. 设计微服务架构
    2. 选择合适的技术栈
    3. 设计数据库模式
    4. 定义API接口规范
    5. 设计缓存和消息队列策略
    6. 考虑安全性和性能优化

    输出应包含完整的架构设计文档和技术选型说明。""",
    agent=tech_lead,
    expected_output="系统架构设计文档和技术选型方案"
)

task3 = Task(
    description="""实现推荐系统的核心算法:
    1. 实现协同过滤算法
    2. 实现基于内容的推荐算法
    3. 实现混合推荐策略
    4. 编写数据预处理模块
    5. 实现实时推荐API
    6. 添加性能监控和日志记录

    代码应遵循最佳实践,包含完整的错误处理。""",
    agent=senior_developer,
    expected_output="完整的推荐系统核心代码实现"
)

task4 = Task(
    description="""设计并实现CI/CD流水线:
    1. 设置代码仓库和分支策略
    2. 配置自动化测试流水线
    3. 设计容器化部署方案
    4. 配置监控和告警系统
    5. 设置生产环境和灰度发布
    6. 编写运维手册和故障处理方案

    确保部署流程的自动化和可靠性。""",
    agent=devops_engineer,
    expected_output="完整的CI/CD流水线配置和运维方案"
)

task5 = Task(
    description="""制定全面的测试策略并执行:
    1. 设计单元测试用例
    2. 编写集成测试脚本
    3. 执行性能测试和压力测试
    4. 进行安全性测试
    5. 用户体验测试
    6. 制定测试报告和质量评估

    确保系统的稳定性和用户体验。""",
    agent=qa_engineer,
    expected_output="全面的测试报告和质量评估文档"
)

# 创建团队
crew = Crew(
    agents=[product_manager, tech_lead, senior_developer, devops_engineer, qa_engineer],
    tasks=[task1, task2, task3, task4, task5],
    process=Process.sequential,  # 顺序执行
    verbose=2
)

# 高级协作模式
class AdvancedCrewManager:
    def __init__(self, crew: Crew):
        self.crew = crew
        self.iteration_count = 0
        self.feedback_history = []

    async def execute_with_feedback_loop(self, max_iterations=3):
        """带反馈循环的执行模式"""
        for iteration in range(max_iterations):
            self.iteration_count = iteration + 1
            print(f"\n=== 执行迭代 {self.iteration_count} ===")

            # 执行任务
            result = self.crew.kickoff()

            # 质量评估
            quality_score = await self.evaluate_quality(result)

            if quality_score >= 0.8:  # 质量达标
                print(f"质量评分: {quality_score:.2f} - 项目完成")
                return result
            else:
                print(f"质量评分: {quality_score:.2f} - 需要改进")
                feedback = await self.generate_feedback(result, quality_score)
                self.feedback_history.append(feedback)

                # 根据反馈调整任务
                await self.adjust_tasks_based_on_feedback(feedback)

        print("已达到最大迭代次数,返回最佳结果")
        return result

    async def evaluate_quality(self, result) -> float:
        """评估结果质量"""
        # 这里可以实现更复杂的质量评估逻辑
        evaluation_criteria = [
            "需求完整性",
            "技术可行性",
            "代码质量",
            "测试覆盖率",
            "文档完整性"
        ]

        # 模拟质量评分
        import random
        base_score = 0.6 + (self.iteration_count * 0.1)
        score = min(1.0, base_score + random.uniform(-0.1, 0.1))
        return score

    async def generate_feedback(self, result, quality_score) -> dict:
        """生成改进反馈"""
        feedback = {
            "iteration": self.iteration_count,
            "quality_score": quality_score,
            "improvements_needed": [],
            "specific_actions": []
        }

        if quality_score < 0.5:
            feedback["improvements_needed"].extend([
                "需求分析不够深入",
                "技术方案需要重新评估"
            ])
        elif quality_score < 0.7:
            feedback["improvements_needed"].extend([
                "代码实现需要优化",
                "测试覆盖率有待提高"
            ])
        else:
            feedback["improvements_needed"].extend([
                "文档需要完善",
                "性能优化空间"
            ])

        return feedback

    async def adjust_tasks_based_on_feedback(self, feedback):
        """根据反馈调整任务"""
        print(f"根据反馈调整任务: {feedback['improvements_needed']}")
        # 这里可以动态调整任务描述或添加新任务

    def generate_final_report(self, result):
        """生成最终项目报告"""
        report = f"""
# 电商推荐系统项目完成报告

## 项目概览
- 执行迭代次数: {self.iteration_count}
- 团队成员: 5名专业代理
- 项目周期: 完成

## 交付成果
{result}

## 质量保证
- 反馈循环: {len(self.feedback_history)} 轮
- 持续改进: 已实施

## 团队协作
各代理角色明确,协作高效:
- 产品经理: 需求定义和业务对齐
- 技术架构师: 系统设计和技术选型
- 高级开发: 核心功能实现
- DevOps工程师: 部署和运维
- QA工程师: 质量保证

## 后续建议
1. 建立用户反馈收集机制
2. 持续监控系统性能
3. 定期更新推荐算法
4. 扩展多语言支持
"""
        return report

# 使用示例
async def main():
    manager = AdvancedCrewManager(crew)

    print("启动电商推荐系统开发项目...")
    print("团队配置完成,开始执行...")

    try:
        result = await manager.execute_with_feedback_loop(max_iterations=3)
        final_report = manager.generate_final_report(result)

        print("\n" + "="*60)
        print("项目执行完成")
        print("="*60)
        print(final_report)

        # 保存报告
        with open("project_report.md", "w", encoding="utf-8") as f:
            f.write(final_report)

        print("\n报告已保存到 project_report.md")

    except Exception as e:
        print(f"项目执行出错: {e}")

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())
7.1.3 Google A2A (Agent-to-Agent) 协作示例

Google A2A是Google开发的代理间通信协议,支持大规模分布式AI代理系统。A2A协议基于gRPC和Protocol Buffers,提供高性能的代理间通信。

# Google A2A 代理通信系统
import grpc
from concurrent import futures
import threading
import time
from typing import Dict, List, Any
import json
from dataclasses import dataclass
from enum import Enum

# 定义消息类型
class MessageType(Enum):
    TASK_REQUEST = "task_request"
    TASK_RESPONSE = "task_response"
    STATUS_UPDATE = "status_update"
    HEARTBEAT = "heartbeat"
    ERROR = "error"

@dataclass
class AgentMessage:
    sender_id: str
    receiver_id: str
    message_type: MessageType
    payload: Dict[str, Any]
    timestamp: float
    correlation_id: str = None

class A2AProtocol:
    """A2A协议实现"""

    def __init__(self, agent_id: str, port: int = 50051):
        self.agent_id = agent_id
        self.port = port
        self.connections: Dict[str, grpc.Channel] = {}
        self.message_queue = []
        self.running = False

    def register_agent(self, agent_id: str, host: str, port: int):
        """注册其他代理"""
        channel = grpc.insecure_channel(f"{host}:{port}")
        self.connections[agent_id] = channel
        print(f"已连接到代理: {agent_id}@{host}:{port}")

    def send_message(self, receiver_id: str, message: AgentMessage):
        """发送消息到指定代理"""
        if receiver_id not in self.connections:
            print(f"错误: 未找到代理 {receiver_id}")
            return False

        try:
            # 这里应该实现实际的gRPC调用
            # stub = AgentServiceStub(self.connections[receiver_id])
            # stub.SendMessage(message)
            print(f"发送消息到 {receiver_id}: {message.message_type.value}")
            return True
        except Exception as e:
            print(f"发送消息失败: {e}")
            return False

    def broadcast_message(self, message: AgentMessage, exclude: List[str] = None):
        """广播消息到所有连接的代理"""
        exclude = exclude or []
        for agent_id in self.connections:
            if agent_id not in exclude:
                self.send_message(agent_id, message)

    def start_server(self):
        """启动A2A服务器"""
        self.running = True
        print(f"代理 {self.agent_id} 启动A2A服务器,端口: {self.port}")
        # 这里应该启动实际的gRPC服务器
        # server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
        # add_AgentServiceServicer_to_server(AgentServiceServicer(), server)
        # server.add_insecure_port(f'[::]:{self.port}')
        # server.start()

class TaskManagerAgent:
    """任务管理代理 - 基于A2A协议"""

    def __init__(self, agent_id: str = "task_manager"):
        self.agent_id = agent_id
        self.a2a = A2AProtocol(agent_id, 50051)
        self.task_queue = []
        self.worker_agents = {}
        self.completed_tasks = []

    def register_worker(self, worker_id: str, capabilities: List[str]):
        """注册工作代理"""
        self.worker_agents[worker_id] = {
            "capabilities": capabilities,
            "status": "available",
            "current_task": None,
            "performance_score": 1.0
        }
        print(f"注册工作代理: {worker_id}, 能力: {capabilities}")

    def submit_task(self, task: Dict[str, Any]):
        """提交任务"""
        task_id = f"task_{int(time.time())}"
        task["id"] = task_id
        task["status"] = "pending"
        task["created_at"] = time.time()

        self.task_queue.append(task)
        print(f"提交任务: {task_id} - {task['description']}")

        # 尝试分配任务
        self._assign_task(task_id)

    def _assign_task(self, task_id: str):
        """分配任务给合适的代理"""
        task = next((t for t in self.task_queue if t["id"] == task_id), None)
        if not task:
            return

        # 根据任务类型和能力匹配代理
        suitable_agents = []
        for agent_id, info in self.worker_agents.items():
            if (info["status"] == "available" and
                task["type"] in info["capabilities"]):
                suitable_agents.append((agent_id, info["performance_score"]))

        if not suitable_agents:
            print(f"没有可用的代理处理任务: {task_id}")
            return

        # 选择性能最好的代理
        suitable_agents.sort(key=lambda x: x[1], reverse=True)
        selected_agent = suitable_agents[0][0]

        # 发送任务
        message = AgentMessage(
            sender_id=self.agent_id,
            receiver_id=selected_agent,
            message_type=MessageType.TASK_REQUEST,
            payload=task,
            timestamp=time.time(),
            correlation_id=task_id
        )

        if self.a2a.send_message(selected_agent, message):
            # 更新代理状态
            self.worker_agents[selected_agent]["status"] = "busy"
            self.worker_agents[selected_agent]["current_task"] = task_id
            task["assigned_to"] = selected_agent
            task["status"] = "assigned"
            print(f"任务 {task_id} 已分配给 {selected_agent}")

    def handle_task_response(self, message: AgentMessage):
        """处理任务响应"""
        task_id = message.correlation_id
        result = message.payload

        # 更新任务状态
        task = next((t for t in self.task_queue if t["id"] == task_id), None)
        if task:
            task["status"] = "completed"
            task["result"] = result
            task["completed_at"] = time.time()
            self.completed_tasks.append(task)

            # 更新代理状态
            agent_id = task["assigned_to"]
            if agent_id in self.worker_agents:
                self.worker_agents[agent_id]["status"] = "available"
                self.worker_agents[agent_id]["current_task"] = None

                # 更新性能评分
                if result.get("success", False):
                    self.worker_agents[agent_id]["performance_score"] *= 1.1
                else:
                    self.worker_agents[agent_id]["performance_score"] *= 0.9

                self.worker_agents[agent_id]["performance_score"] = max(0.1,
                    min(2.0, self.worker_agents[agent_id]["performance_score"]))

            print(f"任务 {task_id} 完成,结果: {result.get('status', 'unknown')}")

            # 处理队列中的下一个任务
            self._process_next_task()

class WorkerAgent:
    """工作代理 - 执行具体任务"""

    def __init__(self, agent_id: str, capabilities: List[str]):
        self.agent_id = agent_id
        self.capabilities = capabilities
        self.a2a = A2AProtocol(agent_id, 50052)
        self.current_task = None
        self.task_manager_id = None

    def register_with_manager(self, manager_id: str, manager_host: str, manager_port: int):
        """向任务管理器注册"""
        self.task_manager_id = manager_id
        self.a2a.register_agent(manager_id, manager_host, manager_port)

        # 发送注册消息
        registration_message = AgentMessage(
            sender_id=self.agent_id,
            receiver_id=manager_id,
            message_type=MessageType.STATUS_UPDATE,
            payload={
                "action": "register",
                "capabilities": self.capabilities,
                "status": "available"
            },
            timestamp=time.time()
        )

        self.a2a.send_message(manager_id, registration_message)
        print(f"代理 {self.agent_id} 已向管理器 {manager_id} 注册")

    def handle_task_request(self, message: AgentMessage):
        """处理任务请求"""
        task = message.payload
        self.current_task = task

        print(f"代理 {self.agent_id} 开始执行任务: {task['id']}")

        # 模拟任务执行
        result = self._execute_task(task)

        # 发送任务响应
        response_message = AgentMessage(
            sender_id=self.agent_id,
            receiver_id=message.sender_id,
            message_type=MessageType.TASK_RESPONSE,
            payload=result,
            timestamp=time.time(),
            correlation_id=task["id"]
        )

        self.a2a.send_message(self.task_manager_id, response_message)
        self.current_task = None
        print(f"代理 {self.agent_id} 完成任务: {task['id']}")

    def _execute_task(self, task: Dict[str, Any]) -> Dict[str, Any]:
        """执行具体任务"""
        task_type = task["type"]

        if task_type == "data_processing":
            return self._process_data(task)
        elif task_type == "api_call":
            return self._make_api_call(task)
        elif task_type == "calculation":
            return self._perform_calculation(task)
        else:
            return {
                "success": False,
                "error": f"不支持的任务类型: {task_type}",
                "status": "failed"
            }

    def _process_data(self, task: Dict[str, Any]) -> Dict[str, Any]:
        """数据处理任务"""
        data = task.get("data", [])
        operation = task.get("operation", "sum")

        try:
            if operation == "sum":
                result = sum(data)
            elif operation == "average":
                result = sum(data) / len(data) if data else 0
            elif operation == "max":
                result = max(data) if data else 0
            elif operation == "min":
                result = min(data) if data else 0
            else:
                raise ValueError(f"不支持的操作: {operation}")

            return {
                "success": True,
                "result": result,
                "status": "completed",
                "processing_time": 0.1
            }
        except Exception as e:
            return {
                "success": False,
                "error": str(e),
                "status": "failed"
            }

    def _make_api_call(self, task: Dict[str, Any]) -> Dict[str, Any]:
        """API调用任务"""
        url = task.get("url")
        method = task.get("method", "GET")

        try:
            # 模拟API调用
            import requests
            response = requests.request(method, url, timeout=10)

            return {
                "success": True,
                "status_code": response.status_code,
                "data": response.json() if response.headers.get('content-type', '').startswith('application/json') else response.text,
                "status": "completed"
            }
        except Exception as e:
            return {
                "success": False,
                "error": str(e),
                "status": "failed"
            }

    def _perform_calculation(self, task: Dict[str, Any]) -> Dict[str, Any]:
        """计算任务"""
        expression = task.get("expression")

        try:
            # 安全的表达式计算
            allowed_names = {
                "__builtins__": {},
                "abs": abs, "round": round, "min": min, "max": max,
                "sum": sum, "len": len, "pow": pow
            }
            result = eval(expression, allowed_names)

            return {
                "success": True,
                "result": result,
                "status": "completed"
            }
        except Exception as e:
            return {
                "success": False,
                "error": str(e),
                "status": "failed"
            }

# 使用示例
def main():
    # 创建任务管理器
    task_manager = TaskManagerAgent("task_manager")

    # 创建工作代理
    data_worker = WorkerAgent("data_worker", ["data_processing", "calculation"])
    api_worker = WorkerAgent("api_worker", ["api_call", "data_processing"])

    # 注册工作代理
    task_manager.register_worker("data_worker", ["data_processing", "calculation"])
    task_manager.register_worker("api_worker", ["api_call", "data_processing"])

    # 提交任务
    tasks = [
        {
            "type": "data_processing",
            "description": "计算销售数据总和",
            "data": [100, 200, 150, 300, 250],
            "operation": "sum"
        },
        {
            "type": "api_call",
            "description": "获取天气信息",
            "url": "<https://api.openweathermap.org/data/2.5/weather?q=Beijing&appid=your_key>",
            "method": "GET"
        },
        {
            "type": "calculation",
            "description": "计算复利",
            "expression": "1000 * pow(1.05, 10)"
        }
    ]

    for task in tasks:
        task_manager.submit_task(task)
        time.sleep(1)  # 模拟任务间隔

    print("所有任务已提交")

if __name__ == "__main__":
    main()
7.1.4 Agent框架对比表
框架 优势 学习曲线 生态系统 适用场景 扩展性
AgentScope 多代理协作 发展中 复杂模拟
LangChain 工具丰富 成熟 通用AI应用 极高
CrewAI 团队协作 新兴 角色分工项目
Google A2A 高性能通信 Google生态 大规模分布式 极高
AutoGen 对话代理 微软支持 自动对话
Semantic Kernel 企业集成 .NET生态 企业应用

8. 工具选择建议

8.1 项目规模和复杂度矩阵

项目类型 前端选择 后端选择 数据库选择 部署选择
小型项目/MVP Vue3 + Vite Supabase/Express.js SQLite/Supabase Vercel/Netlify
中型项目 React/Next.js Express.js/Django PostgreSQL/MongoDB Vercel/Railway
大型项目 Next.js/React Django/Spring Boot PostgreSQL集群 AWS/GCP
企业级项目 React/Angular Spring Boot/.NET Core Oracle/PostgreSQL 私有云/混合云

8.2 团队技能匹配建议

团队技能评估 → 工具选择
├─ JavaScript强势团队
│   ├─ 前端: React/Vue3/Next.js
│   ├─ 后端: Express.js/Fastify
│   └─ 数据库: MongoDB/PostgreSQL
├─ Python强势团队
│   ├─ 前端: Django模板/Vue3
│   ├─ 后端: Django/FastAPI
│   └─ 数据库: PostgreSQL/Redis
└─ 全栈新手团队
    ├─ 前端: Vue3 (学习曲线平缓)
    ├─ 后端: Supabase (减少后端复杂度)
    └─ 数据库: Supabase (托管服务)

9. 总结

现代前后端开发工具生态系统提供了丰富的选择,从前端框架的React、Vue3、Next.js到后端的Express.js、Django、Supabase,再到数据库的PostgreSQL、MongoDB,每个工具都有其独特的优势和适用场景。选择合适的技术栈需要考虑项目规模、团队技能、性能要求和开发时间等多个因素。

随着AI技术的发展,Agent开发工具如AgentScope、LangChain、CrewAI正在改变软件开发的模式,使得自动化开发和智能协作成为可能。同时,云原生技术和边缘计算的普及,使得Vercel、Cloudflare Workers等新一代部署平台提供了更好的性能和开发体验。

相关推荐