85 lines
1.9 KiB
Go
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
|
|
}
|