From 8e24f3322f4bb90d18f17364f5542d202da31a0b Mon Sep 17 00:00:00 2001 From: Sven Alaric Brandt Date: Fri, 21 Nov 2025 23:25:17 +0000 Subject: [PATCH] Add function to build final structured summary --- .../__pycache__/__init__.cpython-313.pyc | Bin 311 -> 311 bytes .../report_summary_engine.cpython-313.pyc | Bin 3865 -> 4283 bytes .../services/summary/report_summary_engine.py | 33 +++++++++----- ...ummary_engine.cpython-313-pytest-8.4.2.pyc | Bin 18276 -> 21348 bytes .../tests/test_report_summary_engine.py | 42 +++++++++++++----- 5 files changed, 54 insertions(+), 21 deletions(-) diff --git a/backend/app/services/summary/__pycache__/__init__.cpython-313.pyc b/backend/app/services/summary/__pycache__/__init__.cpython-313.pyc index dfb7570e845909bc750bf6c34a39db792ea58300..f5b2ae3209634b2b6d6ea34f0142c8392a0ad3eb 100644 GIT binary patch delta 20 acmdnaw4I6jGcPX}0}!xyDsJS~VFUm%{{!p* delta 20 acmdnaw4I6jGcPX}0}$BFRM^O^!w3L1a0GP# diff --git a/backend/app/services/summary/__pycache__/report_summary_engine.cpython-313.pyc b/backend/app/services/summary/__pycache__/report_summary_engine.cpython-313.pyc index 361c4b959871a62ced80f78c2174b055c8f30303..c5185484e5f0f6b3366bfe9ed61b55c5d003c6a5 100644 GIT binary patch delta 1328 zcma)6&rcgi6rNps?e%*7Ll|(OwzVW~uw}*?;no&_>F(rpKA&Fdt^6Vaz3s8Lq?H z*Xfn}zgey#NHWqXVNHaxZYfvgN>!G|I||TBSrT(lD2ckgJHI0otD^L-K{sJQ9IFK= zoCrrO&T-h3Wp<$^;UjksG`TY>?Qi-+4S!7Y#}53XUnMsaO?IfkhBP*`lX#fiP41oD zL-puvBRa1|=j+iMYUIQH8|p`&sM(wvUOr%jLlX#${WZva8`+Mi=cej|)0?gq4Wbtw zPVY{CKXXKx`ljcIJ`fE|4r ziMJ?V^Be+P+H#+!>U)W5MRN_k2~!Vd>SJ0?z>PGeyA7$fp-CG@03hN$5)a<@$$z?m zmW66oxWC@;hBa?^=j;xudoMP;am^dAd#4`rPo~s`#royc@7~m5w*nX9^5$T$IdJCC zMh!5Vjus2tewFqex8K3~kJ~KnecW~%I26Et;pa;}Ho;haF$WDl!zSF8U!6hhf3r;_ z`e|j`ks;=kmg8;Ws=_*b#Ih20Mkn5){5$fa**(vrYr7jQfWs&9{;ax~*}txRknJSY zrDavftE&Z7C}>N!pBW(Ko-;dl)i@OR!T|}t4nU`;OXYmED9%U=I5b`#G=N>pL=eQE V!1o789GT|`!oPL?Uto-#(&s=uTTK7} delta 881 zcmYjQO-S2d82-|#W;o$|q+1VXL;vI_9Q`wa%ZpO}pw~Lf6@-m9{BKDp;KE zu!EjP2?K?}^s=8@cN50IqsN4bErBslW5$mjNLSMw=N zlK@r!Hcat!vH2xw)*-6XWbw^3X8QE!IbkOd#&zyH2Ec331+uvO7HhL%HxSkff*3Z1 z%S8)g83iD303a996}Ta0l#665jz^7hpOtNC22oQF-moE&<6_LzAST8Eu%f(rzPZ82 z3}^Yb&+->^t087S9}iJ{Q>-aU*g(|MV{Eu5`WmS;+2ErF*+;t8S>UtYFR*^UABOo% zPT&@~te9Hn;1rkR1qnv;nM^`hfk>cXq=v;c3>HW@ibM;GlGt15Aa(D9Wll(>(=a;6 z3!DhOd|rb5JPZbWy0c*Dg$2B`d%l2o1p@^~-4e+rAND!zj-;4&U2#v&Ez5a;rcNeUV!SQ zD;so`Xsr-Vm2fId_>dSnX1o=qQ)N1jn84=5Mx;tzu24{=;7<1r_dc_mDTVj!Wp`i2 z9ai1pvOA(&9o}D3+9waGsfN~ZM0rn4z!j_!z~VTcU-kIkuP*JbzFSkNj*YQ~Wvs%6 zR5nx+_rhg%pu!HT>~NVKQ94EsE*y+2kDn;xv&w8-X@7b|B~EbQ4b{x&vO|Z&&8p4* zYGrd}iz(YY3gHm~`f>fXX=VToT5CKmN(m`77f(o%kb0JvI58d<2IU=_6MH0ov0cAL zo4g++{eY#Bk83r6;J$PaRwkzp#?-qrbpk!YZ~cZ0TV@6aQEq*U;MX@0cQSl3pXU07 hdkE^kf!Kyx4aYF-8*qLFk)Os}n0L$n3!qEg_!qaQ^dkTO diff --git a/backend/app/services/summary/report_summary_engine.py b/backend/app/services/summary/report_summary_engine.py index ef7000c7..c3f9d1a4 100644 --- a/backend/app/services/summary/report_summary_engine.py +++ b/backend/app/services/summary/report_summary_engine.py @@ -45,17 +45,28 @@ def generate_scores(self, data: Dict[str, Any]) -> Dict[str, float]: return scores - def build_final_summary(self, nlg_outputs: Dict[str, str], scores: Dict[str, float]) -> str: - summary_parts = [] - summary_parts.append("--- Comprehensive Report Summary ---") - + def build_final_summary(self, nlg_outputs: Dict[str, str], scores: Dict[str, float]) -> Dict[str, Any]: + overall_summary_parts = [] for agent, output in nlg_outputs.items(): - summary_parts.append(f"\n{agent.replace('_', ' ').title()} Insights:") - summary_parts.append(output) + overall_summary_parts.append(f"{agent.replace('_', ' ').title()} Insights: {output}") + overall_summary = "\n\n".join(overall_summary_parts) + + weaknesses = [ + score_name.replace('_', ' ').title() + for score_name, score_value in scores.items() + if score_value < 5.0 + ] - summary_parts.append("\n--- Overall Scores (out of 10) ---") - for score_name, score_value in scores.items(): - summary_parts.append(f"{score_name.replace('_', ' ').title()}: {score_value:.2f}/10") + strengths = [ + score_name.replace('_', ' ').title() + for score_name, score_value in scores.items() + if score_value >= 7.0 + ] - summary_parts.append("\n--- End of Report ---") - return "\n".join(summary_parts) + final_summary = { + "overall_summary": overall_summary, + "scores": {score_name.replace('_', ' ').title(): round(score_value, 2) for score_name, score_value in scores.items()}, + "weaknesses": weaknesses, + "strengths": strengths, + } + return final_summary diff --git a/backend/app/services/summary/tests/__pycache__/test_report_summary_engine.cpython-313-pytest-8.4.2.pyc b/backend/app/services/summary/tests/__pycache__/test_report_summary_engine.cpython-313-pytest-8.4.2.pyc index de205a1e87c9724a775ec9308712ba2c76408348..9e55eb2b495710637631db6b068fff8c495880ea 100644 GIT binary patch delta 4598 zcmd6rUrbxq8Nhwey=%{Jn~g*XA5U0<4o zEpn>ufo{=6bF?gAa7s0G?FKfW`HxS9Aqm^mm5lEVQ4=h#QxFL<{JP}bmcwEa$HuTsyv@uNGNhr zabbv?jWqwDZWu#4lq&d>CyP-vs#M>)-TWs(IDhNi)^M#b$^P6I7WUuzqAw)W)Z@HE zh+c%BjrUJKcKI>(c7FqX27}rW2iS-GFQp#0(J^%Mz@sSPjukJW2O%Q*5Kkcn5n+T6 zF@!jbz^hP35JwObhz`Wlh$+OhEd^KVRGvj;7V!e&IO2K49D*l0hSCh;Ie_Tp)lptV zLp9=M#7l?>;_HZSAWk6`5w9Um0`jh@wM+9$31v0Pz6k9*aSk2dM8ptFh|`EOh;Jdj zjhIKAMMM#=BNh-cVi}OcGO?4bUY2Neus09-h19K|ADkt=8*rO`YLf)1OtMQPWRD9{ zx#W;4q)MqOM3^uX44<*XT>gvL&ya$AxXh3e&mJ&Mv%(@&Uvf&6{i>{={k|s1UMqXW zP9+!UC)rtd6`LQfW>1&-Xx*jeQck$#8G7B6RB(#QTr ztJquhE_a+rp2SkbJ`O7;F0u=xzp5ruF(gQ}rxw@;q>nld3&v(1zh*sOb6=>8=dP6M zr20rD3%H(luPsXrdzQIz&oVddN#;hVMss38@|0tpXClO`_hnkBcgv|otheA`QMZUU ztf|#3YPr-VwMWVa1YTk%-af&}-mGtGaZCtns^s0HyuK%$x0~-bVwW1Q3UP<^T6Ba6 z)?^G`cX$S|CVu`52EKAlI$`gPdr<4HC!Ke^P!qn}I6c#3ylpmHgcjaBct?YYKSW%- zK7TEo4U1X!wyUebAE}17wfocyLuH4}lSJBY9szF%`|U3Rg>@b|EZeQRyCJx z;!{kYn(%J498E0B{^fMAPo_Fj8zEklVYHStYe@>3BsONU8d5#yO>beqBFYVSCOB_wamtu=@d_h+Hu$gA16ZiEN;>QT= z!$e_YfZeX|NQK3u=)7ELE=R;<-o7Ho;eOO$=spCtnaU_&!ySd{DJs9}uZc;cW86gd zj{wjx*1f(STUnf6ip8VF`(iYW7W7$yw^1k9N1^8NS3%EHY?qAv4H{h!_E?6QcTwtSNlT>;4kYmk*?emw``t6G zscWF%0hMflR^y88h1b6lBw;IjF!MD5Sz?Yf@okP8+D=il++f?fXleQ*nq|%qUn)nNG}3u}M5mouVvaQF+&p4vJ4MlQ zgYEi=rRk4omN`Q@bF@(-f$Kdw4P=Qq(j>4sZfH9wrYw(TybcvJqjj8aX_k;7fd>wo z>xf29YqO{H$FMAoE5eNIMUPS&ZM zCFV$jh0Yr4PKli1kye-`fIUaY|JxQ*|HB?jwuqNqw>7HM_6N4|a!0PCv-A}SIJgxM za6Gh?yBwcm(5Hw`ocC>?Q4ruE+}p5wTWX{BRYw1<kiJc zLiC~r4oGHrGKHA~po6k4STii)E)kUq_&|v6d?kM6ROkzoV{CQikTA-%cuPdioL;w delta 3245 zcmd6oO-vg{6vubXU>gq@h%pd8m#@GUY;4!asRM}VMu8pzV`QRZb<2s>gY!iZ3YuT zss8wf_U~9$JpQ=D)6DwG_oE)R@A!{VC);!e&N%@?fF5$earuR}pCFGMc02`19e@FH zt%(yThqkR zH%gw()*->NY9>Lxhx}-0W)0*gLoZpk){)y24J0wdK|FGU6)XaF8XQK3i5i7^p<&tR zVl`!2g%_$_s|NDva1Z%r$U+{rSli<>g0(u@V5_5z#_DLpP#tYFRYx1m)zQY8>S)9E z|F>a`&x9Dhg?unKmEsLWOCt7;7>#X*H{@cI9NP#7BWto4O@y~8LZu&`o*mhhJx5TI%ejsv7Vmu}#IALddJ1FgPG(ob_RLM?JG|44fY6YvE zp}*_e%uTl3)SKYuX`#?oLiQ&+1g#xTc-~IMUO(LW#sfNVBN0x}1}--e+evV-dz{I+DL?0PPPoS1uH@O1LUUp;lGyTd=bavH%MRscqMLBM{0P+H>quas_0B)$ zSOA*W2iM71^(T4&9g;_UIWlM$;f63QolHo+NS{w5_zYF zVfL6Ot?okC)UUNQHsjvHGYi8F6uNq;v>NxWJu@?n-Fd4^wYt)sS?kQ+>=W!(&}4c= z#glndUKup0V0TI8Dq=l>n(3A2DmAHA%9Ao#G+DrX3K~10)yMLvyfSD^!F?r}tBCak zY97$)<#hFw((No7E8ueqav!FKRcN-nGRUpqb0wLpi1h?&9uDhDJ*9Lzi`)e~tRT;! zPsN@*Dz6OkD3~4wnR_0m^zD*+=+g}q3g}7?vdB}wV+!)6O)94Q<&{A`1->Vcxr$g% zpk~^nE48fX{ZDGpIE#D*Jgy*rn)dF`qw>lizkYC~E;*FcJY3P0dP?bb7J17r^*_8*`uy&H|5E!E#_m^a@BGwbAc@WZ-dP-5dOFt@^=zk$^Et>D{gd>S?RF(o{d+BBN3i)hF az#`q0l7M~k*HSn8kaP=|%r@4k9s3&^c{%?8 diff --git a/backend/app/services/summary/tests/test_report_summary_engine.py b/backend/app/services/summary/tests/test_report_summary_engine.py index 50b5a5cb..41b18f99 100644 --- a/backend/app/services/summary/tests/test_report_summary_engine.py +++ b/backend/app/services/summary/tests/test_report_summary_engine.py @@ -41,19 +41,41 @@ def test_build_final_summary(summary_engine): nlg_outputs = { "tokenomics": "Tokenomics insights text.", "social_sentiment": "Social sentiment insights text.", + "code_audit": "Code audit insights text.", } scores = { "tokenomics_strength": 7.5, - "sentiment_health": 8.2, + "sentiment_health": 4.2, + "code_maturity": 8.9, + "audit_confidence": 3.0, } summary = summary_engine.build_final_summary(nlg_outputs, scores) - assert "--- Comprehensive Report Summary ---" in summary - assert "Tokenomics Insights:" in summary - assert "Tokenomics insights text." in summary - assert "Social Sentiment Insights:" in summary - assert "Social sentiment insights text." in summary - assert "--- Overall Scores (out of 10) ---" in summary - assert "Tokenomics Strength: 7.50/10" in summary - assert "Sentiment Health: 8.20/10" in summary - assert "--- End of Report ---" in summary + assert isinstance(summary, dict) + assert "overall_summary" in summary + assert "scores" in summary + assert "weaknesses" in summary + assert "strengths" in summary + + # Verify overall_summary content + assert "Tokenomics Insights: Tokenomics insights text." in summary["overall_summary"] + assert "Social Sentiment Insights: Social sentiment insights text." in summary["overall_summary"] + assert "Code Audit Insights: Code audit insights text." in summary["overall_summary"] + + # Verify scores content + assert summary["scores"] == { + "Tokenomics Strength": 7.5, + "Sentiment Health": 4.2, + "Code Maturity": 8.9, + "Audit Confidence": 3.0, + } + + # Verify weaknesses + assert "Sentiment Health" in summary["weaknesses"] + assert "Audit Confidence" in summary["weaknesses"] + assert len(summary["weaknesses"]) == 2 + + # Verify strengths + assert "Tokenomics Strength" in summary["strengths"] + assert "Code Maturity" in summary["strengths"] + assert len(summary["strengths"]) == 2