kyorlin2001/code-analysis-tool
0
1from __future__ import annotations2 3from dataclasses import dataclass, field4 5from models.rag_result import RagResult6 7 8@dataclass9class MergedAnswer:10 """11 Combined output from the deterministic analyzer and the RAG layer.12 """13 14 summary: str15 findings: list[dict] = field(default_factory=list)16 recommendations: list[str] = field(default_factory=list)17 rag_answer: str | None = None18 rag_suggestions: list[str] = field(default_factory=list)19 rag_citations: list[dict] = field(default_factory=list)20 rag_follow_up_questions: list[str] = field(default_factory=list)21 rag_notes: list[str] = field(default_factory=list)22 23 24class AnswerMerger:25 """26 Merges existing analysis output with RAG-generated insights.27 """28 29 def merge(30 self,31 summary: str,32 findings: list[dict],33 recommendations: list[str],34 rag_result: RagResult | None = None,35 ) -> MergedAnswer:36 if rag_result is None:37 return MergedAnswer(38 summary=summary,39 findings=list(findings),40 recommendations=list(recommendations),41 )42 43 merged_summary = self._append_rag_summary(summary, rag_result)44 45 merged_recommendations = list(recommendations)46 for suggestion in rag_result.suggestions:47 if suggestion not in merged_recommendations:48 merged_recommendations.append(suggestion)49 50 return MergedAnswer(51 summary=merged_summary,52 findings=list(findings),53 recommendations=merged_recommendations,54 rag_answer=rag_result.answer,55 rag_suggestions=list(rag_result.suggestions),56 rag_citations=list(rag_result.citations),57 rag_follow_up_questions=list(rag_result.follow_up_questions),58 rag_notes=list(rag_result.notes),59 )60 61 def _append_rag_summary(self, summary: str, rag_result: RagResult) -> str:62 parts = [summary]63 64 if rag_result.answer:65 parts.append("")66 parts.append("RAG Insight:")67 parts.append(rag_result.answer)68 69 if rag_result.notes:70 parts.append("")71 parts.append("RAG Notes:")72 for note in rag_result.notes:73 parts.append(f"- {note}")74 75 return "\n".join(parts)