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 }