使用 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()
```
影响:可能导致文件句柄泄漏
result, _ := processData(input)
cache[key] = value // 多个 goroutine 可能同时访问
const maxRetries = 3 // 应该从配置文件读取
context.WithTimeout 控制超时sync.Pool 优化内存分配// 修改前
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)
}
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
}
## 审查不同类型的代码
### Go 代码
```go
result, _ := ag.Chat(ctx, "审查 server.go,重点检查并发安全和错误处理")
result, _ := ag.Chat(ctx, "审查 app.py,检查 PEP 8 规范和安全问题")
result, _ := ag.Chat(ctx, `
审查 pkg/ 目录下的所有 .go 文件
生成审查报告,按问题严重程度排序
`)
审查 Git 提交的代码:
ag, _ := agent.Create(ctx, &types.AgentConfig{
// ...
Tools: []string{"filesystem", "bash"},
})
result, _ := ag.Chat(ctx, `
1. 运行 git diff HEAD~1 查看最近的提交
2. 审查变更的代码
3. 生成 Code Review 评论
`)