场景示例

代码审查

使用 Agent 自动审查代码

代码审查示例

使用 Agent 自动审查代码质量、发现潜在问题。

完整代码

package main

import (
    "context"
    "fmt"
    "log"
    "os"

    "github.com/astercloud/aster/pkg/agent"
    "github.com/astercloud/aster/pkg/provider"
    "github.com/astercloud/aster/pkg/sandbox"
    "github.com/astercloud/aster/pkg/store"
    "github.com/astercloud/aster/pkg/tools"
    "github.com/astercloud/aster/pkg/tools/builtin"
    "github.com/astercloud/aster/pkg/types"
)

func main() {
    ctx := context.Background()

    // 创建工具注册表
    toolRegistry := tools.NewRegistry()
    builtin.RegisterAll(toolRegistry)

    // 创建依赖
    deps := &agent.Dependencies{
        ToolRegistry:     toolRegistry,
        SandboxFactory:   sandbox.NewFactory(),
        ProviderFactory:  provider.NewMultiProviderFactory(),
        Store:            store.NewMemoryStore(),
        TemplateRegistry: agent.NewTemplateRegistry(),
    }

    // 创建代码审查 Agent
    ag, err := agent.Create(ctx, &types.AgentConfig{
        TemplateID: "assistant",
        ModelConfig: &types.ModelConfig{
            Provider: "anthropic",
            Model:    "claude-sonnet-4-5",
            APIKey:   os.Getenv("ANTHROPIC_API_KEY"),
        },
        SystemPrompt: `你是一位资深的代码审查专家。

审查重点:
1. 代码质量和可维护性
2. 潜在的 bug 和安全问题
3. 性能优化建议
4. 最佳实践和设计模式

输出格式:
## 总体评价
简要总结代码质量

## 具体问题
按严重程度排序:
- 🔴 严重问题
- 🟡 警告
- 🟢 建议

## 改进建议
提供具体的改进方案(附代码示例)

## 优点
指出代码中的亮点`,
        Tools: []string{"filesystem"},
    }, deps)
    if err != nil {
        log.Fatal(err)
    }
    defer ag.Close()

    // 审查代码
    result, err := ag.Chat(ctx, `
请审查 main.go 文件的代码质量。
重点关注:错误处理、并发安全、资源泄漏
`)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(result.Message.Content)
}

输出示例

## 总体评价

代码结构清晰,但存在一些需要改进的问题,特别是在错误处理和资源管理方面。

## 具体问题

### 🔴 严重问题

1. **未关闭文件句柄** (第 45 行)
   ```go
   file, _ := os.Open("config.json")
   // 缺少 defer file.Close()
   ```

影响:可能导致文件句柄泄漏

  1. 忽略错误返回 (第 52 行)
    result, _ := processData(input)
    
    影响:可能隐藏严重错误

🟡 警告

  1. 并发访问 map 未加锁 (第 78-82 行)
    cache[key] = value  // 多个 goroutine 可能同时访问
    

    影响:可能导致数据竞争
  2. 硬编码配置 (第 15 行)
    const maxRetries = 3  // 应该从配置文件读取
    

🟢 建议

  1. 使用 context.WithTimeout 控制超时
  2. 添加更多的日志记录
  3. 考虑使用 sync.Pool 优化内存分配

改进建议

1. 修复资源泄漏

// 修改前
file, _ := os.Open("config.json")
data, _ := io.ReadAll(file)

// 修改后
file, err := os.Open("config.json")
if err != nil {
    return fmt.Errorf("打开文件失败: %w", err)
}
defer file.Close()

data, err := io.ReadAll(file)
if err != nil {
    return fmt.Errorf("读取文件失败: %w", err)
}

2. 并发安全

type SafeCache struct {
    mu    sync.RWMutex
    cache map[string]interface{}
}

func (c *SafeCache) Set(key string, value interface{}) {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.cache[key] = value
}

优点

  1. ✅ 函数命名清晰,遵循 Go 惯例
  2. ✅ 使用了接口抽象,易于测试
  3. ✅ 代码结构合理,职责分明

## 审查不同类型的代码

### Go 代码

```go
result, _ := ag.Chat(ctx, "审查 server.go,重点检查并发安全和错误处理")

Python 代码

result, _ := ag.Chat(ctx, "审查 app.py,检查 PEP 8 规范和安全问题")

批量审查

result, _ := ag.Chat(ctx, `
审查 pkg/ 目录下的所有 .go 文件
生成审查报告,按问题严重程度排序
`)

集成 Git

审查 Git 提交的代码:

ag, _ := agent.Create(ctx, &types.AgentConfig{
    // ...
    Tools: []string{"filesystem", "bash"},
})

result, _ := ag.Chat(ctx, `
1. 运行 git diff HEAD~1 查看最近的提交
2. 审查变更的代码
3. 生成 Code Review 评论
`)

相关资源