Files
ai-code-review/services/ai/ai.go
2025-02-18 16:53:34 +08:00

85 lines
1.9 KiB
Go

package ai
import (
"code-review/services"
"code-review/services/types"
"fmt"
"log"
"strings"
)
// AI 实现了 CodeReviewer 和 AIPool 接口
type AI struct {
model string
systemMsg string
client AIClient
}
// NewAI 创建新的 AI 实例
func NewAI(model, systemMsg string, client AIClient) *AI {
return &AI{
model: model,
systemMsg: systemMsg,
client: client,
}
}
// GetAI 实现 AIPool 接口
func (a *AI) GetAI() services.CodeReviewer {
return a
}
// Review 实现 CodeReviewer 接口
func (a *AI) Review(changes *types.CodeChanges) (*types.ReviewResult, error) {
log.Printf("AI 开始审查代码: model=%s", a.model)
// 构建审查请求
prompt := a.buildPrompt(changes)
// 调用 AI API
response, err := a.client.Chat(a.systemMsg, prompt)
if err != nil {
log.Printf("AI API 调用失败: model=%s, error=%v", a.model, err)
return nil, fmt.Errorf("AI API 调用失败: %w", err)
}
// 解析审查结果
result, err := a.parseResponse(response)
if err != nil {
log.Printf("解析 AI 响应失败: model=%s, error=%v", a.model, err)
return nil, fmt.Errorf("解析 AI 响应失败: %w", err)
}
log.Printf("AI 代码审查完成: model=%s", a.model)
return result, nil
}
// buildPrompt 构建代码审查的提示词
func (a *AI) buildPrompt(changes *types.CodeChanges) string {
var prompt strings.Builder
prompt.WriteString("请审查以下代码变更:\n\n")
for _, file := range changes.Files {
prompt.WriteString(fmt.Sprintf("文件: %s\n", file.Path))
prompt.WriteString("diff:\n")
prompt.WriteString(file.Content)
prompt.WriteString("\n---\n\n")
}
return prompt.String()
}
// parseResponse 解析 AI 的响应
func (a *AI) parseResponse(response string) (*types.ReviewResult, error) {
return &types.ReviewResult{
Comments: []types.Comment{
{
Path: "全局",
Content: response,
},
},
Summary: "代码审查完成",
}, nil
}