From ae6801a7d5d28e764a1050ff76630c51482530a3 Mon Sep 17 00:00:00 2001 From: jinye_huang Date: Thu, 10 Jul 2025 16:10:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=BA=86json=E6=8F=90?= =?UTF-8?q?=E5=8F=96=E7=9A=84=E6=A8=A1=E5=9D=97=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E5=85=AC=E7=94=A8=E5=85=B1=E4=BA=AB=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/__pycache__/__init__.cpython-312.pyc | Bin 741 -> 738 bytes core/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 739 bytes core/ai/__pycache__/__init__.cpython-312.pyc | Bin 266 -> 263 bytes core/ai/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 244 bytes core/ai/__pycache__/ai_agent.cpython-312.pyc | Bin 9182 -> 9146 bytes core/ai/__pycache__/ai_agent.cpython-38.pyc | Bin 0 -> 5756 bytes core/ai/ai_agent.py | 19 ++-- .../__pycache__/__init__.cpython-312.pyc | Bin 580 -> 577 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 579 bytes .../__pycache__/manager.cpython-312.pyc | Bin 9232 -> 9189 bytes .../config/__pycache__/manager.cpython-38.pyc | Bin 0 -> 5864 bytes .../config/__pycache__/models.cpython-312.pyc | Bin 8840 -> 8832 bytes core/config/__pycache__/models.cpython-38.pyc | Bin 0 -> 7068 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 707 -> 704 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 805 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 12585 -> 12572 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 9228 bytes docs/开发指南.md | 2 +- scripts/generate_vibrant_poster.py | 6 +- utils/__pycache__/__init__.cpython-312.pyc | Bin 473 -> 470 bytes utils/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 464 bytes utils/__pycache__/file_io.cpython-312.pyc | Bin 8241 -> 10437 bytes utils/__pycache__/file_io.cpython-38.pyc | Bin 0 -> 5143 bytes utils/__pycache__/pipeline.cpython-312.pyc | Bin 6912 -> 6895 bytes utils/__pycache__/pipeline.cpython-38.pyc | Bin 0 -> 4091 bytes utils/__pycache__/prompts.cpython-312.pyc | Bin 25358 -> 25294 bytes utils/__pycache__/prompts.cpython-38.pyc | Bin 0 -> 14750 bytes utils/file_io.py | 88 +++++++++++++++++- utils/poster/text_generator.py | 25 +---- .../__pycache__/__init__.cpython-312.pyc | Bin 150 -> 147 bytes .../tweet/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 141 bytes .../content_generator.cpython-312.pyc | Bin 4981 -> 4830 bytes .../content_judger.cpython-312.pyc | Bin 6156 -> 5680 bytes .../topic_generator.cpython-312.pyc | Bin 6457 -> 6449 bytes .../topic_generator.cpython-38.pyc | Bin 0 -> 3908 bytes .../__pycache__/topic_parser.cpython-312.pyc | Bin 3182 -> 2538 bytes utils/tweet/content_generator.py | 13 ++- utils/tweet/content_judger.py | 55 +++++------ utils/tweet/topic_generator.py | 2 +- utils/tweet/topic_parser.py | 59 +++++------- 40 files changed, 157 insertions(+), 112 deletions(-) create mode 100644 core/__pycache__/__init__.cpython-38.pyc create mode 100644 core/ai/__pycache__/__init__.cpython-38.pyc create mode 100644 core/ai/__pycache__/ai_agent.cpython-38.pyc create mode 100644 core/config/__pycache__/__init__.cpython-38.pyc create mode 100644 core/config/__pycache__/manager.cpython-38.pyc create mode 100644 core/config/__pycache__/models.cpython-38.pyc create mode 100644 core/exception/__pycache__/__init__.cpython-38.pyc create mode 100644 core/exception/__pycache__/exceptions.cpython-38.pyc create mode 100644 utils/__pycache__/__init__.cpython-38.pyc create mode 100644 utils/__pycache__/file_io.cpython-38.pyc create mode 100644 utils/__pycache__/pipeline.cpython-38.pyc create mode 100644 utils/__pycache__/prompts.cpython-38.pyc create mode 100644 utils/tweet/__pycache__/__init__.cpython-38.pyc create mode 100644 utils/tweet/__pycache__/topic_generator.cpython-38.pyc diff --git a/core/__pycache__/__init__.cpython-312.pyc b/core/__pycache__/__init__.cpython-312.pyc index 12b4e3e8e68cd1d4ad8ebd4835a12d651a660e63..9aed1f4446900be3257961c20168d89c5e98ceef 100644 GIT binary patch delta 70 zcmaFL`iPbLG%qg~0}x0>&m4{{9-2?})% b(NE4VO4W~#&&lIEF2gR diff --git a/core/__pycache__/__init__.cpython-38.pyc b/core/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72acb3a7ad7f334551b52c0b9dc13ab50bfbf82b GIT binary patch literal 739 zcma)(&ui2`6vy*xlWaEGpI+?IlZ&uh?;@@u(nCdTz073@ndvr=$t*9~;(8KVFH%sv z2o_uSrWcQ*g8F~VRg<+xub!Mqw^GG}FXThMkH_~rnRhP;JWbXL;@c~xrhQf7Z23}L zlW#VWAR5w$j&x!WGclNnOlBdA)liMu$Yu_5n2TIiM|I{QPuJv}l{A=-{OY@w1gwdg ztc6;vjoPwj6Nk8@PCU{eJ_$&Zv`CwD#y;wh?uORyO|Q#XuYC2s__A9(KKj1}Ir{6vw9M3;24&E+a?42Ddp6wS$9~bk7<>9;XaL;>CyF6GOtRCyqt?!EN znC3X*=~g_(EKI{O1rgk+^!lkBt*vuHlasFS@9-?AuvBU`r)j>F&AT+?Q;6v4@WxCI zv!&|YqA7(ir<;5dM<>m`E}YTYXe>SYrZ~R|;Z7A*nF0-S4mSZfh&Iq1W|*gVD~yvV zP|?{AQ<6|j??-f!$2`rzkbeboc^X&>H3eJ2QE(ON3To5PP*7WiK;m}4D;$gok1!Su zjCUwx(o+gMs_x@|&5;qtRe-4fKG|PcDkw}6jNfR`QwLD^d1(lo=fi(p!7$=LhZx6c noMSwg%!GS|aWYNlRkg_Mf`nyT=0(rf&sm24$79G+ogcpd-Pzc1 literal 0 HcmV?d00001 diff --git a/core/ai/__pycache__/__init__.cpython-312.pyc b/core/ai/__pycache__/__init__.cpython-312.pyc index a450e56d3ff5c4f7d0ad18a06c3844dbd13e5677..e820027445df00f15c31b5d9c61016fb05188109 100644 GIT binary patch delta 71 zcmeBTYG>j;&CAQh00dG|`4hQk8R+R3<>!~^hZH52rRF&2=ar=9l{gorCYIzE=_ltG ZrRpbU>c_`t=4F<|$LkeT-kNyB2mt(h7=8c% delta 58 zcmZo?>SE$P&CAQh00eVig`k0;#C{j1VCG7{oyaOhAqU5En}Ui4=w?h7`sWrX0pxrYI&xh7{&>#wg|# zmS6@=)>28J0xn0-=d*V_ZQcBA!H%cgf6=`6X-_NHOGcoqCgUx3M^DG})Vz`+ zkhy-EEVtO><5TjJveX>s z{JavNNzO&7i6!|(`pNl4srreT`tk9Zd6^~g@p=W7w>WHa^HWN5Qtd#t7qb8f7G@qM E04K#ld;kCd literal 0 HcmV?d00001 diff --git a/core/ai/__pycache__/ai_agent.cpython-312.pyc b/core/ai/__pycache__/ai_agent.cpython-312.pyc index 4402035f8e556062d7a0bb72795fd81a180071fd..4e281073bf7bb3dd47b09e530af950359fedf9a2 100644 GIT binary patch delta 1559 zcmZ`&ZA@EL7(VBIwe*vgwzn;mmahs#C?BKab5M(cIoU^;kwt|}ZV@V>^Y%`R-ntFU zWTOhpF@mCICi=t78J9*g=YEX1kqtJ3&dJsg)BRx6e|0k%oBr_J3wKJQC%Nx^-sgSa z=e+ma_x#d!rp>UR*J}V?GyReNxtvpm9xA)s$44T9Z#Td9<Kt@eWr7wo!LVA(2`EVd5VNAKOhLpbW^oxa6qhMl zXTXQF5`{pth1KM;ReH*9M})%Zy;qST=*Z{Bgmw75;2?HicQ&U zt(DFH-->NxD-;l#6miajKBigpxyFWc8dFvL!DbMjF91TZk|2~SsE;TFd?dySWeUTY zMHcPQI-n1|q#1@4_^h(fUm9l}`#L)bz1emiGH(q^&L=^V_r== zLEhu=ej>-}h6fDryQ+Y$y@@!#1-92Q=bI}rzEA<%8<-1~wHVKpkR1j%_h_I9I~PsG z*tu8-CEOs}CS!+|zN8BjKH;b5D;OM}_nR@bpf29#rx#>q!LP&2WumErp)WV9aLyHm z#>^FMizMDlC;-;96!` zT7})!>DsgoSlOwzV{OwNS1qMu8Ov(Jg!YJb(bjmj^PJ<`?#0F@7cCt>skdJ@+85RK z`%&q-jnIK+_$C$55aTeQX5u796JE@HZN_F+4Y5C~slhl&387bn4Zn{BsLpW??m-V6 zemIe+bWT&ObPtkDG{OrZE~y$Ehzi^Q&v&6zu3ftY$N0x26F{VUl=%R|Xb{ESZRF3c zMzrj%A+NcD$lr+myD0Om-r6BsP9vQJs6wBt;fo!9>(k0h!&BSOfYj z&kuh@sl1}6cR`wm*Ik}8xrTgI3TkOxM=7goI&`cjP0JanO^v6YI<;fnOEVz5;CRh@ zzO+h?V!yr#WAtpkLoYLT`UoxUNITJJeisa)<^1>Y4IVD&GCog0_Z=Wv-if>V8+aXo AR{#J2 delta 1611 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 tj@{VTNeZt}G`)@~a|>|Ht{w int: """ diff --git a/core/config/__pycache__/__init__.cpython-312.pyc b/core/config/__pycache__/__init__.cpython-312.pyc index 50abd48869b43d57945b1abc9221cb71eafb20e5..2fc169abc06709af191f94995b2f81cdbc433bcf 100644 GIT binary patch delta 77 zcmX@Ya*&1lG%qg~0}x0>cnpfgnl$uzQU!z>% diff --git a/core/config/__pycache__/__init__.cpython-38.pyc b/core/config/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62d66508af342f56cf802b9db3563b30fb501554 GIT binary patch literal 579 zcma)(%SyvQ6ozwc?yVQx^a;$yfNK#i3vp2qTR~66nq7jZu$nk zNVX!SFVKZ6=d>vm+&II0@Xs9nbD7&9a22__h(9b;Mfn8rd%^38JmsAPQIJAZqU9>n zkj8YRtDyDVU?wtI3$>VqEM_B{Imlrya+!xb<|ALm8N?(lViB7-#3df_NsziIAnm>q zc1GLM-kncgW*^hp^lkR~^z}S(=dvOt)asp-Ryg6seU@St7ja5O9h@(9ZzV&!cF*FH zt}g4~^s>hZ%^T_W$7MxXquMvLIA9t7420ot?m4N(RGRg*^)Tm#l0J(H{yP8ii0LBLVmCMu_Cp=q!IqimQ9_X7YL zLIIN&6+jvQAU^OM01Xk>3?#Ndwj+Hj^A@^b-Rsr~c$Z z2_s%0{hb}82BdlOItejm#x0YNN_%o#RyO;@z{F`gSx`oU8Axxok-5ptczLpzLMZ1I zK_j4gUJu5}c?x2hAjT6Op?>d9?-?2kOctoE;NQWrq3nW$-Blj@@2ntci0aKN6gDz3 K{+b-6+zkLV9%fYl diff --git a/core/config/__pycache__/manager.cpython-38.pyc b/core/config/__pycache__/manager.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c43c1f18c29a7816407d1d236bbbe6c4f2d8b2bd GIT binary patch literal 5864 zcmcIo>vJ2`72mg356h1@#tAP$J2;}n8E9c>noPkqs)>_W$FHygZNL3$ z!E*?$wggxtf&_3VOg$u7nyoVp2c$Ct2V}4qGtnBeb=$P#YjBj)3QMpg`V!4H9C>P5 zWnCeG=KHl+w+ar4m74;3y~Cp3Ub>K zP~E`&C~o(MD2h@|%0X38%APVMc`9xVw~pJGf^tsl=!-E4yH!TAdSK>@xiaAz7_LAx zhHEtI? z_amsFYnOI^BypIX^zFUtx#M{2M|pmq&@Z7J+|GLrUte&zje-_iUk*=ocw#>`kSkV- zUM_bV1h_pYB-xM+MU$i7zpDd}wnH)8oRF3IAVwDyniE}ACv6hvxD^#os>xF_onlQI zmuHk&$-U20XEY|)1*`5?y47_*X$lb?yvzc5GDFG85Wji6q*bbRs5 zeEsrUA=+)IQg3V6CO+nFXgyKa@)>W)gtHo_jx1dIGL+UDDvUp}da=&Jg=6(k-lVUOq62E+G~eC1(tJ8t69X4i9>_7EAVs<838-+Y&bAxII=R18qURHdk`; zESE2pnoYUg+$od5tisne7ZKQo#Vu$HR*6~7kFGsC#03T@B8L>NR;|Q}s_{N=r4vGXp6tT=+QB&~uj(t?uhpo;KH1 z_WH?Viywa08r)_PV%N=Ki{~z7*43}Ra&7ifyelgIFKL7X^Kmol7{vo%kY?bgX5~rMQ)()pQQYk{ z1Sxw={vd1vAk`v!SRPp!^facBcVn0_uH#=js|%1-Xuj@$3DK?7TRQ$#{luvd$ol-d z3s>Iwe_*-z=G?-?z8mz0WM9q~o9DxChv*>oLY`Of9)UJia&`$Hg`f@@L1;o62@5o5 z0#T$!#~o-yr97D82$rTG{k;| zHj~RhQ2MGn-wwT4X19%@cST^|A>koqo5Fzbc6qliifE9 zITa66K?E7-MJR~NH=zz+DtY@eH@2xxhc_im=oXk9L?y(8PK|shLPms%7zmJQlt!}Hv^uF2C3s3@MiW?M zLM%LBL!OX7(5wLweWSGZftt!+f_DZ&BwMUvdhn1l@mXoAl}ykY2rnr!AtQftZt?i1 z^}kHjPrP&O$cd#74lkZL?G3WDASlMIm&#IQWX4BW9S;x1la|$L&RHmuCV1BI3nbT z6m(r@#4Y;0f?gsfH|@cY!~Aa?IU|TlIjew>m5_)@iAYf<)#_FcL`o*kbQt*{$kP}X zW*ZTzMl{$YQO^YZ#)UjkZj*jNlbb=4i9HE^0VIi!P1Uh_OU+ z+L-=$Y5oenP{9W^-kxcE@m914k=j;uL9K!O!m@+8MzQWzq%KCW!jNDEDZAqO+|K3Q zLb2#mRNZ3EZafTSK#8GHyh+BVJSlu^4I>wTVbn_=I@2OWPA+pKn+n-5@l3wtN1?vZ zb_&L7GPh7>Z|2Y9FC?j7q87yHa|i`BG2-x2ahG_{z(9t8R<6=$aU>MH zanc>Dk3LWhhvCSuaJ{Zb4p)8*6G^@JBGyXugE;p1xcC4gKnm4HoHiXBe~t>;=nY@c h+!zA-5N*h%GuAW{kql)OgUUJ`K2S~nURq};{{=F1#rOaK literal 0 HcmV?d00001 diff --git a/core/config/__pycache__/models.cpython-312.pyc b/core/config/__pycache__/models.cpython-312.pyc index 343d1c48356fe0b3d011f8a2b45821db256e7b1e..9dd901419232d4e5120434a2cbd70de9c1db5c56 100644 GIT binary patch delta 154 zcmeBhZE)p2&CAQh00dG|`5U>Hvq~H27v<-d=!X;~mZj!6=jWBA=9M@Xr6!i-7frsv zYAi4fsJ4OOft1pGy_tH~q_ieWu!V{pOuek`b1-#B${Nm#8kQSeE^AmGNWD0@o=udQ zL0WtBbhd{ajJGCN@~iT2fVJ;%J|MEwdh#0n8=S0Qfy>TmoBIVU1sHE_KB=&u5dc#( BGur?F delta 178 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 G{rCk3V%<{! literal 0 HcmV?d00001 diff --git a/core/exception/__pycache__/exceptions.cpython-312.pyc b/core/exception/__pycache__/exceptions.cpython-312.pyc index 9453e30aa01c883e1d8c2534a421a3f0a744fef6..8a3c146c7036b1773f17651e7c96d32236e6d1c6 100644 GIT binary patch delta 120 zcmZ3PG$)DsG%qg~0}x0>|O#80$Sa`@Iit>OrpW>hM>YH1}0X` W$()+X%s_gxz9u&t&^BxRhl~Kb-!&8f diff --git a/core/exception/__pycache__/exceptions.cpython-38.pyc b/core/exception/__pycache__/exceptions.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23d39134b9715ef493777bd2b9d318d3537acea3 GIT binary patch literal 9228 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 Dict[str, A raw_result = await self.ai_agent.generate_text(...) # 解析和保存结果 - content_data = json.loads(raw_result) + content_data = json_repair.loads(raw_result) self.output_manager.save_json(content_data, "article.json", ...) return content_data diff --git a/scripts/generate_vibrant_poster.py b/scripts/generate_vibrant_poster.py index 50e4544..35a2a69 100644 --- a/scripts/generate_vibrant_poster.py +++ b/scripts/generate_vibrant_poster.py @@ -8,13 +8,13 @@ import os import sys import json +import json_repair import random import asyncio import argparse import logging import re from datetime import datetime - # 将项目根目录添加到Python路径中 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) @@ -34,7 +34,7 @@ def read_data_file(file_path: str): # 尝试解析为标准JSON try: - return json.loads(content) + return json_repair.loads(content) except json.JSONDecodeError: # 如果不是标准JSON,尝试解析为类JSON格式 logger.info(f"文件 {file_path} 不是标准JSON格式,尝试其他解析方式...") @@ -220,7 +220,7 @@ async def generate_info_with_llm(ai_agent: AIAgent, scenic_info: dict, product_i if json_start >= 0 and json_end > json_start: json_str = response[json_start:json_end] - content_dict = json.loads(json_str) + content_dict = json_repair.loads(json_str) logger.info(f"LLM成功生成内容: {content_dict}") # 添加默认的按钮文本和分页信息 diff --git a/utils/__pycache__/__init__.cpython-312.pyc b/utils/__pycache__/__init__.cpython-312.pyc index a8327b93275c53d743a8502470a1fd845d6a16dc..ba88289a07cabed7e0e77b9f41524be6cc0baf07 100644 GIT binary patch delta 71 zcmcb~e2tm=G%qg~0}x0>oFUrp^(GMv~EKALC&d)1J%`0&(N=+=uFVZh9 Z$;>I%kB`sH%PfhH*DI*JHF+MRH2@Vm7-Rqd delta 74 zcmcb{e3O~`G%qg~0}!OX&e_PF#Av9mUzDF;qMuk=lAn^JTasI#AL8sBALJSw5)|qj cqF-8)nNzGEAD@|*SrQ+wS5WzD@@z(H0Bp_~G5`Po diff --git a/utils/__pycache__/__init__.cpython-38.pyc b/utils/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..821b21fd5fe7badaefd01b8182998c59edcad9f7 GIT binary patch literal 464 zcmZ9I%Sr<=6oxam&UD&(?aDV85a$I%#BM~q6s?=M2tyNVAejuAMDPK+bMMN93qhZt z?~<*I;45@xQtzISkDMRQpFcV8^-^GK1B$B)4}cff{H~U5cI~eBEiixpd)Q|l_o2@N z7f>NOmXK7WL>>#?b2rU*i2`yPY=!g zU2{84-)sVq`DW>q)I!TKITQsZ()3QWs-p-$icl@#ump}$HWL>F-8c+my{7i#m|UI zs?Q*cVHj775cNM7XHhVQ&@+%7XYDZG%%u=2AIajHuz@HQDb+xdLJ65`MOmFAL`$j= e+Ny3$vdsn7jO@5Ss{0mUxZ-uae&BoGYyJ-1$$JR^ literal 0 HcmV?d00001 diff --git a/utils/__pycache__/file_io.cpython-312.pyc b/utils/__pycache__/file_io.cpython-312.pyc index 467bd4f12e935c0a0271943067fa6da8ce1ef1a1..7838b7d08fd89e0ef2edb419976694f3ed9f74c8 100644 GIT binary patch delta 3339 zcma)8dr(x@89(>2cb~8?mdCQdMjo;lAtDt8sw9wV)S^~vD$&7}dsSc`^xnk>S-Lud z1}8+I7X`J^wbhE%Di)^$mex$7GwC>;S%eh4@sB#Pi~c2v&ctLoou2P5E7*tanYq97 zo$q|-dz|y#bG~ckw>Qkc6BnmJxcy1+?*2n6LJwgOYswko=_g(DUk{KjMYVz@Sjxq? zmDNfDVVZWS-0EtzTT`uZYpb1thSY|Ht#1Lx@)(bRO*5P-s|-hY~r1J zI9G+&W(L_>m&z`P5;=XSvWLi3IEWT?j z7N_V3*{Y~N2-V9w6B|YQEW~HGkUpLGHmc)qPQ+?WO)|$rI0O?G#E}Abzern3IjCBzlL}>*5z<@*?7kU|kx3>=b}m^y-ci zMFUJ+GfCu$2lY0hTs*Cx&#VBka`BG7kXR@FL+>VvM3>>uDQ{u+MUwvk%&x@Xp!j!y zUL#f+R}!1WU+7A|QQ(OXmT6AhNn{N?NW4rin?TunqL{pVRShPw zp_d(#6nptPANMM!vOq=DDWIHUO3Et6gGu3h%(KF1iW!VO$}VNEa?D_tv+RF3xojZa zdJOjKdg>di!MiGla@IYG7I13+N5_=%Zb_Otw{sU)!#aJ=m;B4ORT9kuf^7{ECvS5( zR_!48cf>nsZxDyXzo+E{AafiQ z27u$?Iei+Q;ql@mfsQ&fFN7L6`kriJ#?qCMFX zVEpKXJ%wMvFZ2`j#u=k?I=`Y4buhKq=UQ@`385Co&%DZJ7ulXbW7!sF*18&B$pK|O zUOn5yT(#l#jaZP7h4-RNs06AwQGO)=w^5L)aj{{t*bY#s|x?NXX^5=CkKD`WVk)jeKpd4FnsRh)P;{C z!Qt?5N2H@O+;RNL@JU(2qI`RlQC8sFUFT_79_~Ckbu!QzK71&AWk?n&jEQXDz8&78 z@Xy;ZH97R*uwpa`gP83%`n-?u;C}J~{ZC$ng&%zql;x zE6TS|{_*Bici)`HZt~`p@VOZWANO1dJpN^`EGxsC{4SwHrXXhcvrFuAV-6oZ6Ta}_ z919>O%m0Y;HSwM~i=!^dF-EuQ>d>QWXYoGGOq{#+==%9^Ti`@=L#w=G^of`}s;FG{`dvqfwZyavYV`(@&`P?GMhwvFT#baJH?5Gzd_Q#)t zT`E66-(ipxf{(A8c^9Eg(#knh)9B=Vf@Fx!dReY! zhs#^rAn;AFC|cu0Ig&!|WdoA>g(5xxwgsr3;3%U_E=wd!Bk!%{1fj;|a@WWPw99V}tm8o;nh%#j& z(b`krRUfqWZ5T}~Xw%-;2IAY^AJwMzI`3*TCUmLex_KkIdBM`YpPpSlo>@GSSv;D# zY)n^zRU}(ObizYAZo-t%lh>6ON-G;=M@%16{_LRQ zg7&QTeB5B^NXE)B)v9TRQp8Q@?QQRm>+K_YdoW>CpA%B$1it-RjqIz4=g%}qXZact zinx0!-86;!@1|8qkuXkMM`&wr(V3DHC8x^9=-j6aO3ZFkPt&y8_@yps!kpGw)Kk(` z(pxub&b_P4eU1Yk*JqCCGqE>1LlIex`OBT z^~oS@xu;72Y0G!hDcH(0J5p#rSbK17$Xq&H@ri!4Y<;M7LukYHkkL6t@3>EEV6t<0 zFe~Wmqk?%sTi?czanTrEIHA=G@S1;WO{&nUK3!(4Frd#2>Ixh6St^0?7Hz4tk+*F6 zqRM>5t%U?&q2+B2d0V4?J5h1lLSS?xL`w>Ij3kD~$>(*;xhn3=sC-i{KHz7K7O--$ zAQvBUO21r6NUAcomu+%!%lSii1^m5&OMH-FB~0SC8TkvoLfxBi!|= X`V;zV2N(D6zLq|cTmB4qa%u8Uhe&)* delta 1285 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 JHMvi!2ms23A&dY3 delta 122 zcmaEF+F-_gnwOW00SLlu@-}koaLVcH7v<-d=qHwz zY!2d_$;$Y7@*6&B&KsiApBT6~D;Otp@prI*7@Mc^e`IF7HMw0_o%4Z++9w8HknBd` TY!(n>v%E+w8{@CZwNga@&h#Y^ diff --git a/utils/__pycache__/pipeline.cpython-38.pyc b/utils/__pycache__/pipeline.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..304b801b2967aeaf0d3a37ff6a9d050dec8f456c GIT binary patch literal 4091 zcmai1>u(g-6`$A6&W?Be#27D+Y#(m2X|R=~sam&+VnLM<1*ZzMO-8Cl%g)$cv$M0g zGh4t~M-V#%2*^~0v;oz>jA z=iGDdxsTs@?5{EzUBHty+~4K42*OuHtbb$>&*AlMp|J!*utZBLi-yR*k|E(Mmt{vW z6enRM9Mw>rq>&U!PAO}SW@x;hD5o6V(497;%}E<+Cu3xscB9?tFgp0STJChZj4s|! zmb;xEqlfpk@)oDp=;i%Xd8^ZB^zpu4-sbch{i0xt^I3a)Lo{|gFIa6>dPcC)(~_~% zk`4&@Ol>EYt%oPy3K##mbm40A)cNM$Pb@9Gv$WV)I)5^}w4kp*Kp4#{f$~zx^8;mX zsptptNaa|dyc(DS@qu^EOBy46xK z8Vh<`Owhhv@nd%Sz%kFaotSEW#rE79E7~!g8QHhrwd`_4!fJA4-^e($(apSE^Q$#K zHVQ^NHy4|6891HLBU|fvv{vH1ShKL!BJFkklK}A?UayMA7I3Qq-KZg3?Y3ekY^7hY z`@Jf|2I8(-Cz1 zvQ)LprHUQzt2T&r=s7&gx34bW{vbRzyL@Z9dGYpxJJ&Z~A{QLZOMzbGH)2{P7O1RN zF-umFfZKYgui)K-*ZVgbUzir^f+^O832|Pkiw#i(jlOJ&zS58|mWXM|S2>-GY1!8} zor-D2*E!u5(+NM#=}cX!PFkwpKHt$0<~yxqL%b|pp_#kzkIr>-V#pc-#FQn|M1d4X{tu-oqyO@z7a@r>=w_zZ0H)7pPx3 z@y9jnuS$%tac_8)BAvAp9nP)1b#CeY;?m{C@czYzgrcJ!&Mkj&ez|dW-`@Xxem4B* z&E{X`9^AP*>Q?OV)TQOOuZL$ABG+5hHMBy>bO`E!>T!<vbZhGkugHqVKX}hCXil zW+cecq?N)lVw$3$k%<=5;)ndrClBlFt|&~Yn0c2kOlYxmTU{kdif`v6l70rZrqnmoSB2N0`6}KzWu*36H#QPp zo1yfxE-lr51h&3=_wHQt#)m7{ujQT^&V`>Jhu^}Nnm1<=09THmUU~n|kt;>2Imicz zQpK{5el3pM0QmO{a0R4ld;#`(q-+bBYbwDt0C>2B7P~|avnA%$Iyr>|r;y+j z1bY=uF#(`wW1uep=qTj?bO}I*Ltu`!dU6xcrK#i_Ne=WZfS%>aeKXL*#YS`f4u?+! z--r=@_UY0`CzdWOAbTu-_P6CP-frHw7CFIJ$KM>~SI6==0yaR+575-;hSvGY(=A_# zW^6&2B5Q8xy_q#<;Rs>`;LRwGbiWP7?1xawr`R@pj4gJhaHzb7)F`&@#t@?dh7D1( zizG9AsD&Z+Bn>=;Ca*<+rHh9vpe9_mPYMM_8`rcN=%U-D?+}06#BOU^<4xOaM11_IC(bCSVwe2w2JbQYjaW}j> z+dTa-N{*;9j7s_%rJ{A9c(MhGD2TV5VCIbs=(4mVnI$9Adiho`N+aF_y{RB;rJW^m4TyKYNl4+J`7cl zDiA@^0Re@;A$I}}-3VioJ2nDhy=q<@&1Wd-R|<}8nt^Uo`BsAqm_gb!U#}I)@kr7% zEw>1^jG~9p{|okAYACNW!VaTCoUQJK4HKDrxFLKq%99k-JspiED$3SJ9_z{Waz4tw zXTc4UluU3CfimH_6%-T4s-QL+?a2o3TCO`A2NqAB<886K+>Gou$#CCi zj8||eq{x?e&SXEM)p4xQ;e6An1=`P}i+Prg*`sKsDCGXz#I%&t(g*|mC+qV60A{}i A&j0`b literal 0 HcmV?d00001 diff --git a/utils/__pycache__/prompts.cpython-312.pyc b/utils/__pycache__/prompts.cpython-312.pyc index 8a9ffe9cba0509e63d4791ca1e9b77f3c216224a..d2dde44b626440e80bb54b5fcccefb2b074f3120 100644 GIT binary patch delta 733 zcmeA>#(3^1Bll@uUM>b8kc!IR$bFYZT3f#;Kfgpjq$sg0HODzWuOv0E#JMOnu_V7} zGaIWa6Qk>79d ziGM7oJ;CjUr2Ks8nbHe_H<-_mz9MNoIaO9qlR?Vnf~56FW(Ikk55hnzKPWH=i1k-@ zR?o1#%&&QYL-RW?M9Jo3vV|;+Y?CdNl*O-zn(h$1BP~DQa;D{iz}YqvT!6tNW;VH8 zNt^RxPRV75QXn~bgQg_Qg`AR$lMg8wvH_(ph?;Kxt>nl83<6tqNyb~7!_~7H8Ji~` z*1%_?(qt9QHlV3BmmO+>B-GTJi<3`j!cAq?D&j;6d$rJuMy@LYPY9luJSllrdPyOW zyLp1~FGfbk$=#-U+7A`=J~J~b@ZD6@n;~*TTzY!tq{;;@%RLu*ZV<4BBUfIcyO=Fm!NN8;KFwAX0u-g1R)Qk(v+iaL%%>)d;+@ys7 DUbP1Z delta 826 zcmaiyO-vI(6vubEMY=$X4J>Wh7W#p-tDzfdDA3mOQ7}P~gl!Q_ky0d)29%GK13@D( zUc4wWQ6NTvgv1^^l&lIzJ)jtaY`X<(qDkY)V<|?U2jean<>nk_-kbT)?`O zY1YT2<|G0zbyyeA%b&JBu)?Zcl+SmC%apJ&Lzz}-W*XSiqB1SKRoDqJycnb*i8m8U zzUFsiZvu%L=#cKU|6SlsV6}g-E@Ge|#GSkY# z1I=k@z6S1qHibHiKlhSSLBVt@5@@mdFP!QM`&rukiS|Zl?XeTkw|DFl_bgUPdTRq-4#OU%2&l`{mVvL_J{-VR{B z#%vLS!*m-J#K}AXmeeB03+|8K9iKVF<&vy~+?D>rWN@Y zqIj-)wtBwxv177y=t9U9FCN> zF};>F;0M81VLqAAnSY|FRu)%j;tFDVY-()2;aSr{Q#e0bQjtOtIi3`r*&H=osp!NK zO4ANv!n}Y{SScXp${S?x9pIyY8T-LMj E8}u9){r~^~ diff --git a/utils/__pycache__/prompts.cpython-38.pyc b/utils/__pycache__/prompts.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4149402cf2b65441b85a7d57d29a087b798446e1 GIT binary patch literal 14750 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 Optional[Dict[str, Any]]: + """ + 处理LLM返回的JSON字符串,支持多种格式提取: + 1. 提取后的内容 + 2. 提取```json和```之间的内容 + 3. 尝试直接解析整个文本 + 4. 使用json_repair修复格式问题 + + Args: + text: LLM返回的原始文本或已解析的对象 + + Returns: + 解析后的JSON对象,解析失败则返回None + """ + # 如果输入已经是字典类型,直接返回 + if isinstance(text, dict): + return text + + # 如果输入是列表类型,且要求返回字典,则返回None + if isinstance(text, list): + logger.warning("输入是列表类型,但期望返回字典类型") + return None + + # 确保输入是字符串类型 + if not isinstance(text, str): + try: + text = str(text) + except Exception as e: + logger.error(f"无法将输入转换为字符串: {e}") + return None + + if not text or not text.strip(): + logger.warning("收到空的LLM响应") + return None + + # 存储可能的JSON文本 + json_candidates = [] + + # 1. 尝试提取后的内容 + if "" in text: + think_parts = text.split("", 1) + if len(think_parts) > 1: + json_candidates.append(think_parts[1].strip()) + + # 2. 尝试提取```json和```之间的内容 + json_code_blocks = [] + # 匹配```json和```之间的内容 + import re + json_blocks = re.findall(r"```(?:json)?\s*([\s\S]*?)```", text) + if json_blocks: + json_candidates.extend([block.strip() for block in json_blocks]) + + # 3. 直接使用json_repair解析 + try: + return json_repair.loads(text) + except Exception: + pass + + # 4. 添加原始文本作为候选 + json_candidates.append(text.strip()) + + # 尝试解析每个候选文本 + for candidate in json_candidates: + # 直接尝试解析 + try: + import json + return json.loads(candidate) + except json.JSONDecodeError: + pass + + # 使用json_repair尝试修复 + try: + import json_repair + return json_repair.loads(candidate) + except Exception: + continue + + # 所有尝试都失败,记录错误并返回None + logger.error(f"无法解析LLM返回的JSON,尝试了{len(json_candidates)}种提取方式") + logger.debug(f"原始响应: {text[:200]}...") # 只记录前200个字符避免日志过大 + return None diff --git a/utils/poster/text_generator.py b/utils/poster/text_generator.py index 340605f..3d5d672 100644 --- a/utils/poster/text_generator.py +++ b/utils/poster/text_generator.py @@ -9,7 +9,7 @@ import json from typing import Dict, Any, Optional, List from core.ai import AIAgent - +from utils.file_io import ResourceLoader, process_llm_json_text logger = logging.getLogger(__name__) class PosterContentGenerator: @@ -73,28 +73,9 @@ class PosterContentGenerator: self.logger.error("AI未能返回任何内容。") return None - # 预处理并解析JSON - return self._parse_json_response(raw_response) + # 使用通用JSON解析函数处理响应 + return process_llm_json_text(raw_response) except Exception as e: self.logger.error(f"调用AI生成文案时发生严重错误: {e}", exc_info=True) - return None - - def _parse_json_response(self, text: str) -> Optional[Dict[str, Any]]: - """ - 从AI返回的文本中提取并解析JSON。 - """ - try: - # 找到第一个 '{' 和最后一个 '}' 来提取JSON字符串 - start_index = text.find('{') - end_index = text.rfind('}') - if start_index != -1 and end_index != -1: - json_str = text[start_index : end_index + 1] - return json.loads(json_str) - else: - self.logger.error("在AI响应中未找到有效的JSON对象。") - return None - except json.JSONDecodeError as e: - self.logger.error(f"解析AI返回的JSON失败: {e}") - self.logger.debug(f"原始响应文本: {text}") return None \ No newline at end of file diff --git a/utils/tweet/__pycache__/__init__.cpython-312.pyc b/utils/tweet/__pycache__/__init__.cpython-312.pyc index 106c7c4a703315471c01f58628713998d547c0dc..c939d6f85b687bd965895f870af3ada839b5f081 100644 GIT binary patch delta 55 zcmbQnIGK_AG%qg~0}x0>2KczG$)vkyYXci+77lRldnHd=wig`k0;#C{jBp_R7{oyaj6jY95Erumi4=xl22Do4l?+87VFdBZNWUmQzeGQz zD6uRx$2mW*BsH(ZxhOTUB)>?%v?Md9Siht^HMK-PK0Y%qvm`!Vub}c4hfQvNN@-52 L9muTDK+FID)OsLO literal 0 HcmV?d00001 diff --git a/utils/tweet/__pycache__/content_generator.cpython-312.pyc b/utils/tweet/__pycache__/content_generator.cpython-312.pyc index 99c832a234ffe847368d9482b633cda9976c3879..c2b3e7f987b0dd5505d3f1a8191e0f2de7d067fe 100644 GIT binary patch delta 1039 zcmY*YOH30%7@pZ}3#GfX6bdcnVX@V1NXZHMIJFNcI_+W%`O4&Ot}I(qNk+Ym%(BAt|mY2tQ|6;mNsC17cw%{*rg8 zS=&xznMj#)3m)TA9BNB}B$umgj!8eB&3C{u{KQy;Kj&A+ohjxX5M5JjP7Ohdivn$9 zqW~nEHr2UIET^g|W>X`&Q)aPZl8FL=fk0r#^2hQhjsT+obd`3ZK_$^mYj-28B-cl+mNT>-})#9=sArB=C zVnWb#V?vXLR8)wge8Vnep#`%_EXeqnY3JjSlhCMw)-0MboDgCOS(GlIT1wa9MZOoh zu(L1%Z_FhN!?0rAA6$1w*Zjc;J@+Hia3QjI>Q3;^*}Ls&e-OX6*1>B0%i3xE!2zd# zy6;U{;2QVdQidb8eKnsr`>pWxaN50lc64?q?P_1=I^I<_&R<+B4yC!!@9#VCxGi-0 zuX=*?zI@OUYJe~Kf-bM=rPD~UlBJBt+tmPG8DUqw;gx9z&G!UbNMX4ilF4#|IpkxP zclknIcBKlEe5Kk*sw-Y2&3)t-_+e47v7By?rLdm@y{YIB1wREh1s4TA1GvcE+z~K# z!&z~@Wr3X!ypX>FI$tVT64KG$rGe$D9~mMmr7E8Tg~_1jQR@|O&eAa pW5XF+Q5Wq(FJ-ph|7*~(qd35R1g-d3aY<1dgx&BP$PAfg{{Sy_1zi9D delta 1202 zcmY*YU1(cX96#sY+%z{gw@JT}o5ZfE%~sR(!*wuYm`c}fBOlxB5(iT>gxqVF(B9jf z+?p|yZivDJ!PWE9u?^>wj%`q>4}DOGAZ^nKwp6KHRQBMTFJ)H5O~G?+8^X@R@Bcf$ z|K~mToZt5UbwI3%q8*SGcBvOCbD|f{&-JDw5HLW2`2h7iy_A-Fa94S~l>sM#YB*g=!*xk64Y=ovMupa2ytaxSYITuxV}3P{Aw zV*fG2k}qhg!A)uzxnS^x%sWb&Du^DO**hd659NMZLD047TsECkW#tkIQh7ht#B)%> z%i=h^zbG{)pm%d%WXqrYEOlr63s@Qd_RaZ``HMHk*8NF*)p-C0@aN8x?b{9;ABVsD zyFQKFh}_9<`VU=8;QyRQ*?;~Vz;C!>SDx&+fvbJX*|Xv7c?1{|{EMUYH6BlcvQqp|-MJ|M%rcS49ua9OlRUDjoZqu9w( zr8^jvzzPSWZp(`G5arH`S*lKqu=3>|EknlBuBkna9M|lUW zv?jI12|w5scd<1)B)n$E)Lb0pGzN1mBZFRgR4j#~6zKCpQ3~{lARh&Zg2M!?w+xTH z$i?A;ymYw2E``5Tw*lR+wy$Q_ljl}1RQK(e!fq1cm6rS<1_O9>5*dccAi!?Wff;gL_KyeO5acN>gjPY)gb$q1jB?+xf5Iq#C zw3M#YrVu15A(aX$A<-Xc)gM7ZO4RUU-MC8Fg5XE{6DhPv6%v&?v&klurc!66H{ZPX z=Djy>-p-q-y;*6VH<>7a#>IGS;7H~L^X@TCMC;Q+Ktoy+CL%hYPR81>K0^A)2<4+9 z2A@IZ5n*G*`lP~Ffg4wHH$unQvL>_i!Rd4!xVa{x%_5}HdW-Mj_;{A5=l1LIthQbOFk(p0?2$bmo*ML0*L)!*>B~eMb$zXX?+@A856pM>B>T z8j~jc;j3HUt{^UNWB!JhX_PP1{^Di6P`hh+Oj;5a?v#8p!U96P;iCDB2|X8jW;Ez$qkXXhLYakw6~aYJweX{*uKH_G?vRLZtiPY(Bn{S( z)cp+4;s02o*f<-F^MPoPku)?L9~DtvSISAFPg=w2H|pMDa;e@WO~M)nt`+O+TjI9 z{kY+t!7;V#%HX%#)2^M?V{Hw_Vg|^`^Bc?Vpbq+Jh6;6*cUB@KUoTw5U>`ZU5nPLl(p*G z;NEF=`lxuQN8EiZZS8%OnJXG|mE+_bN*fO^mAoSEXc2n{Qkkr1WS{-f3W3`Tm-R%E z`I+#Sz5e*~_)&B>XAfFhO5m)G^5hY-ZY`z-YRoAq_LPA+5_(EBbJTW>_cfLw!F&ls zi}^CLrBFRzTh@}JzUzbt-_6n@>D?SH#)Zg)u*0#vSc_b61Sa^I<6gxC{j-46VA6_7 zo$!%k*Vr3S8-h1Gmw^ms>@&f+Z8HP6b5|Lnw@d8q5qkq-cOd0G@pMIv!w(&2M5Nr# zb)ZSo;R4;1AdAlse-Z-_ MhT!i&o@C>H0};XO_y7O^ delta 2399 zcmaJ@YfK!+9iQ2~+q>Pp$HE=vX*eFmIrBVl!N#2N1MJj?v3WQ()DAvw4}9oeT^8dg zdp#>{qgbLfXsVbbZtJM7lFDvH>V812DxE*Hrom443>9eQG?7}8^g|`$T51*NLuZyd zV@Flzq?zCUH~;tU%-($Mbfay_YUKbP^Ci)9*POGqy-6bkA`}f_CSn>gMa)BHT{ec< z2sgy(mK{#GPTs}L3xi{b@GvuJa5g?ks2SoM; zmEoK(QEqP13Bc@Pi5Y6faLg}G%>FHW>l}QCa+|T1W|3p@P+&L^i;jlIB$iM%EXcvA zoFzH5+t69Mw?T@<z3d6_cw zrqNr#0vVH=LxI_36Ab#?SZ1vkjS6!fNIMl~+=%?V12r;Ug963{lxC`JH!^k!bB1zs ztkuvmB7)@~L_`v{NSI$$B1G*y!*y4X^fRoPkLt?fK>t-|@_H08$ z;VPZr6mGm6y~h-_bb`zLWlMk#fdF-e2jDb*pb0)zH)o28#4cMnOVIx1i89!z7 zq27{?|J4$!-V*22EqUhITC=4j?1<+)*prtF;rWSIbf0U1c9PxRQpNrjz@9R%E`HT> z#4^Pyx~|gwpc2TIY@4fqRGBczSrLru_Pr*>^sN0Lt}S8uj%kLPKEH{k;1sw(4}vKe zpdbj)2}^>X0g`XiEv%y-tpD~$NBfWWtY3fcv)}x@&869i)ENxK#9)^s#iU;Vcag?~ zV`F1MNiz_?8a)=2wVd&ZSaetl#{D5_Sig8QE;JE}PRRafAgCF{P(aq$t_y)+Tn@#e znrX_9F4$w}p}nv~GZ16RgR{}N7yRML%}`PuCJ-+ir8O8tCxv?Ss_;$t3i_+ier$tc z*u(HaS)=MXxLkHfwUj)t7pg@&Z+5QOJ@cdL{uAkz6Kk%3w_J3{WI1F z!nP~?EU%UxNY$mv)RNv6p>Kn`70=;d;d0%9)#CoQ2d?$L3sb$f&&(Z|`}P~1YH>e$ zJ+~UV(C>47$qic`E5ZjwHSZo>E^2+vhl9@5T$fkuwe$H4zO?7a;y2VmG2Jb$H8jug zbH~#{?dJ?|mapw>o$*~`(#{=!&t`CBk^i&(Pj>axi|W~t<>v$H5m7A(t_Y(W*q~t5 zQGMT0y@r8v2ew*udeTnMe6l9xP8F-&XVnh>igV=S{0dd5ARcYAHnqHG@#V#cT6TIx zIJ4%iSNEJyN5bj+h$=+>^C$^{Q1}o)(lkr%<(^AD>h}GqoD{7VcdlBx?pwMZZ_s4- z%YQY3k^#73W-4u8JSxzwDAr4ij$cA6jvdLzj~YQv-l|ZQ7OJj~t9H*rK#`_kjqXd` zYVn?h@&$)l=v}ewTl?Bh_3MY#QzL0d;4hZI;|(Lx{Bq)V_`$x?&|`qVKEV1oaC>iO z2NwR=#`*RzcZ^0db2Mh|*s8iIaHk3SIt+K3cVWEvT=F1&41o7*Al`q!c00yPEWt}0 z>uaHx90fiPy;Q>x#$zN*3rlbZ#MXByw%beJ<#%-NrtdaEf}4$a_wH^Z!Cn&c9w_XA z^u5CE$J*(8Es)?=qI0j^i17!I#!Bd0&RtauE&152JNlj$Zvn;^q3v+uUCQgQf`=m2iBzOG; zNpyoo|Hu;D1?uyL&b diff --git a/utils/tweet/__pycache__/topic_generator.cpython-312.pyc b/utils/tweet/__pycache__/topic_generator.cpython-312.pyc index 6baede2fd7571ed159212997daf098acb76db5a3..2758a0d16ced96e5c9d63a73b296d712b435d3a7 100644 GIT binary patch delta 223 zcmdmKw9$z7G%qg~0}v#nv%;v_@b`k!jJ`lD;N(1 z9*mvgIHPc;%LQG>$<_jDjPje41Rk+4-kR(x+Q6tX`Ix9O>upi#4%f+h#N;LmiJfI; R5R=*bSnM4mP{}2UbO6X7LnHtI delta 232 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 literal 0 HcmV?d00001 diff --git a/utils/tweet/__pycache__/topic_parser.cpython-312.pyc b/utils/tweet/__pycache__/topic_parser.cpython-312.pyc index 339c4fe6cc0746d8f36fe403f1c0ebcda5258881..3e72e298af3f6556c5b27ce7e67cf21143bcb009 100644 GIT binary patch delta 1224 zcmZuwUrbw77(eI!>%IMV3oHF^M9SRS6$m<*#*J-Z$-trLiZYvxhH&q?Hn+X=-iuLF z(mnW45+`e}6O7Sx8O9p?vt=eGW)B!2jPd0*Ekf#ynm~g-Xg5eq^u=>wcj)wc`2L^Y zcfRjC=Qq!DX!_q5EVdqd^SK$<{H2pXK z7&yZLa2jmf+}Dk%q3#pu7`AH*Qu~^#tBVWw9s-S#RtkY52%w2g+Ih;A;K7OK2JD#kDWq zT${hX{@MG#-+aA3Tdd!>y#B`LYcp>>86AGQe)(Gc;wNf>S|ESX7pxvM@qv)NMhRjf z!AmtFnK>&;6pGYHUXnyfZKj7!AxhHspuSB%x<}T7ty}bGZMEniX*V>2$mhe;;|)1Xw~7GwHNF~XK}m)uS^u5)54?Lsngo%8STNb zB}cr$08i(p)#%R^`6zlVQ0eH?T#>`t;ggy(TBS!;SieU5H_$+U+Av4`dyw)WkoF=W zJ*+d@U=DT6;u>ft19Nx-AWufNH*tA#EE$KOC}25hQ9R zeU-^fqDJW7P+hcma<)k&Daf5?lL8-4-d!(~;FY1RrAr~bw9}|Bb?Mr@i`D3ZX_1>0 z_&%uz1@uQFA3&^uLkMrv7$i1m0NL+>ETM4=p3sDafSPd1 zT%?6`Q5MQ2x5zQXl{pnI+LD9;9I%)}i?Y5rSmii2k62Q0uoW=mallaH_;W1vFkUS0 z51y-`NT=J%c!Gcahz}B>FR{`+4DJO3fXnm(2l--799V!#GWfChZJ6!cJh)R~1lIFs|sjW-;vPxns zY9_@?GQ<%GoCQp(mkNDBRQOdq`c{eIC8S(1o_21*!+@7CfdasFv9W<|boPOQT4#9Ovf5bX098$M#w6Txa6AiAi>kz1PEAd%Iat7J8qms}^O5 zC8|&X4Q#iYVH*=KC+)U6`{(Uq1xLd|MP;{>wf3@1C(jP@p`WQ&%S4Rzpre=fd_1iw zMJuF44tiwCUfg9gE{nyyvmO*4bLgq)??s_7SO6Q$tRNqO;t>> zAx;6Mb|fp3oIkD09X=X7I_j9rkLoHXTO+#az_uq8$kGoF1P6o_>nH24D85O(ni{R% z7TeJ}wWA}lqa&u<8&LkP%DJn|IAc6%6te4MO2f1|Gtd;5Wz*Uj{kpI*s`u9fnrGC@ zM-EO@#?<9^)3n3Npi;=K`>yc%JJEWRP-hmF?~0}Ep4Md#(K9er^U3Csk_jT*99>f_ z6x9ed?Lt;ZOt}|UyKF_kC@!-Fw$J1gj*gQYZur~2ZI6}ioYv$`X^JA6qOk0?resE=A8rY@jGDvw;kt_j;Y^{lUFhf% z+O0yt{@a@FIF0f?QGygTsz=b5Usg|cL@Vlra)V&lEo8kNQ|_5o=L*W)e`nG(Q)z{f zw8Almpn?_Qv{vd!PD$8WA2tcu6;~Pp#+b4WcIR}{vp5MkPd(^J-`KpVu@>CiSdY~A zwb@&0h+FEMEtSNrQViLZB$S~6g~?w9*%!fMC;|5x5@;VJ1iB18D100|#Bov)R{$y_ zj+c|#5h4zt8kNC?7KA_u9C1D1z=m zk@EA0`w&DR2wmPB`e}&COSU|R?tCr}!L*I#jfpeFZ9rfa5{ZI0AuBN>TEtVuMwgrE zce0x~19Z{Z_n;Eu1cqS`6*wk)tN@tm4oEJ!1L$AD$_QBb3t0aftq 块 - if "" in raw_text: - raw_text = raw_text.split("", 1)[-1] + # 使用通用JSON解析函数解析原始文本 + parsed_json = process_llm_json_text(raw_text) - # 2. 移除Markdown代码块标记 (e.g., ```json ... ```) - cleaned_text = re.sub(r'```json\s*|\s*```', '', raw_text.strip(), flags=re.MULTILINE) - - if not cleaned_text: - logger.error("移除元数据后,解析内容为空") + if not parsed_json: + logger.error("解析AI响应失败,无法获取JSON数据") return [] - - try: - # 3. 使用json_repair修复可能不规范的JSON并解析 - parsed_json = json_repair_loads(cleaned_text) - if not isinstance(parsed_json, list): - logger.error(f"解析结果不是列表,而是 {type(parsed_json)}") - return [] - - logger.info(f"成功解析 {len(parsed_json)} 个选题对象。开始验证...") - - # 4. 验证每个选题是否包含所有必需的键 - valid_topics = [] - required_keys = {"index", "date", "logic", "object", "product", "style", "target_audience"} - - for i, item in enumerate(parsed_json): - if isinstance(item, dict) and required_keys.issubset(item.keys()): - valid_topics.append(item) - else: - logger.warning(f"第 {i+1} 个选题缺少必需键或格式不正确: {item}") - - logger.info(f"验证完成,获得 {len(valid_topics)} 个有效选题。") - return valid_topics - - except (json.JSONDecodeError, ValueError) as e: - logger.error(f"解析JSON失败: {e}", exc_info=True) - return [] \ No newline at end of file + if not isinstance(parsed_json, list): + logger.error(f"解析结果不是列表,而是 {type(parsed_json)}") + return [] + + logger.info(f"成功解析 {len(parsed_json)} 个选题对象。开始验证...") + + # 验证每个选题是否包含所有必需的键 + valid_topics = [] + required_keys = {"index", "date", "logic", "object", "product", "style", "target_audience"} + + for i, item in enumerate(parsed_json): + if isinstance(item, dict) and required_keys.issubset(item.keys()): + valid_topics.append(item) + else: + logger.warning(f"第 {i+1} 个选题缺少必需键或格式不正确: {item}") + + logger.info(f"验证完成,获得 {len(valid_topics)} 个有效选题。") + return valid_topics \ No newline at end of file