第 3 天 12 分钟阅读

创建第一个自主 Agent

从零开始创建一个功能完整的自主 Agent,学习定义、编写系统提示、运行任务和测试的全流程。

定义 Agent

在 ThePopeBot 中,每个 Agent 都通过一个配置对象来定义。Agent 的定义包含了它的身份、能力和行为规则。

src/agents/custom/ 目录下创建一个新文件 code-assistant.ts

import { defineAgent } from '@thepopebot/core';

export const codeAssistant = defineAgent({
  name: 'code-assistant',
  description: '一个专注于代码生成和审查的自主 Agent',
  model: 'gpt-4',
  temperature: 0.3, // 低温度确保代码输出的一致性
  maxTokens: 8192,
  tools: ['filesystem', 'shell', 'git', 'codeAnalysis'],
  memory: {
    type: 'sliding-window',
    maxMessages: 30,
  },
  autonomy: {
    level: 'semi', // 'full' | 'semi' | 'supervised'
    requireApproval: ['file-delete', 'git-push'],
  },
});

自主等级说明

  • full:Agent 完全自主执行所有操作,无需人类确认
  • semi:大部分操作自主执行,敏感操作需要人类确认
  • supervised:每一步都需要人类确认后才执行

对于初次创建的 Agent,建议使用 semi 级别,在安全和效率之间取得平衡。

编写系统提示

系统提示(System Prompt)决定了 Agent 的”性格”和工作方式。一个好的系统提示应该清晰、具体且有边界。

const systemPrompt = `你是一个专业的代码助手 Agent,专注于以下领域:

## 核心能力
1. **代码生成**:根据需求生成高质量的代码
2. **代码审查**:分析代码质量,发现潜在问题
3. **重构建议**:提供代码优化和重构方案

## 工作原则
- 生成的代码必须包含完整的类型定义(TypeScript)
- 遵循项目现有的代码风格和命名规范
- 每次修改都要说明原因和影响范围
- 对于破坏性操作,先确认再执行

## 输出格式
- 代码块使用正确的语言标记
- 重要变更附带简要说明
- 列出可能的副作用和注意事项

## 限制
- 不要修改配置文件除非被明确要求
- 不要删除测试文件
- 不要自动推送到远程仓库`;

运行代码生成任务

Agent 定义完成后,让我们用它来执行一个实际的代码生成任务:

import { createSession } from '@thepopebot/core';
import { codeAssistant } from './agents/custom/code-assistant';

async function main() {
  // 创建会话
  const session = await createSession(codeAssistant);

  // 发送任务
  const response = await session.send(
    '创建一个用户认证服务,包含登录、注册和令牌刷新功能'
  );

  console.log(response.content);
  console.log('使用的工具:', response.toolCalls);
  console.log('创建的文件:', response.artifacts);
}

main();

Agent 会自动执行以下步骤:

  1. 分析需求,拆解为子任务
  2. 检查项目现有结构和代码风格
  3. 生成认证服务的代码文件
  4. 生成对应的类型定义
  5. 输出执行报告

用 Agent 审查 PR

ThePopeBot 的一个强大用法是用 Agent 来自动审查 Pull Request:

import { codeAssistant } from './agents/custom/code-assistant';

// 配置 PR 审查任务
const prReviewTask = {
  type: 'pr-review',
  source: 'github',
  config: {
    repository: 'owner/repo',
    prNumber: 42,
    reviewFocus: ['security', 'performance', 'code-quality'],
  },
};

const session = await createSession(codeAssistant);
const review = await session.executeTask(prReviewTask);

// review 包含:
// - 总体评价
// - 逐文件的具体建议
// - 安全风险提示
// - 性能优化建议
console.log(review.summary);
review.fileComments.forEach(comment => {
  console.log(`${comment.file}:${comment.line} - ${comment.suggestion}`);
});

PR 审查的最佳实践

  • 明确审查重点:安全、性能、代码质量等
  • 设置合理的严重等级阈值
  • 将审查结果直接发布为 GitHub PR Comment
  • 对于关键项目,可以设置 Agent 作为必要的审查者

测试你的 Agent

编写测试确保 Agent 按预期工作是非常重要的。ThePopeBot 提供了测试工具来模拟 Agent 交互:

import { testAgent, mockTools } from '@thepopebot/testing';
import { codeAssistant } from './agents/custom/code-assistant';

describe('Code Assistant Agent', () => {
  it('应该能生成 TypeScript 代码', async () => {
    const { session, responses } = await testAgent(codeAssistant, {
      tools: mockTools(['filesystem', 'shell']),
    });

    await session.send('创建一个简单的 HTTP 服务器');

    expect(responses[0].toolCalls).toContainEqual(
      expect.objectContaining({ tool: 'filesystem', action: 'create' })
    );
    expect(responses[0].content).toContain('typescript');
  });

  it('敏感操作应该请求确认', async () => {
    const { session, approvalRequests } = await testAgent(codeAssistant);

    await session.send('删除 src 目录下所有测试文件');

    expect(approvalRequests).toHaveLength(1);
    expect(approvalRequests[0].action).toBe('file-delete');
  });

  it('应该保持对话上下文', async () => {
    const { session } = await testAgent(codeAssistant);

    await session.send('创建一个 User 模型');
    const response = await session.send('给它添加邮箱验证方法');

    // Agent 应该记住之前创建的 User 模型
    expect(response.content).toContain('User');
    expect(response.content).toContain('email');
  });
});

运行测试:

npm test -- --grep "Code Assistant"

小结

今天你学会了如何创建一个功能完整的自主 Agent,包括定义配置、编写系统提示、执行任务和编写测试。明天我们将学习如何让 Agent 支持多渠道交互。