From 51cc01538f5c10b4599a619f40b730fb61fb1507 Mon Sep 17 00:00:00 2001 From: zzlgreat Date: Wed, 17 Dec 2025 16:15:14 +0800 Subject: [PATCH] update pay ui --- __pycache__/mcp_server.cpython-310.pyc | Bin 93319 -> 94273 bytes mcp_server.py | 53 ++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/__pycache__/mcp_server.cpython-310.pyc b/__pycache__/mcp_server.cpython-310.pyc index e06d1636aec27e5a68560a948c48edc17cede0a7..0d8d94d16a7ea2e0d381a488b08be4c67514ab90 100644 GIT binary patch delta 4134 zcmcImeNbH06@TZxw+k%GLJSzb5*7#v-;jVp$U-m@^U=g;P$LMT$lXL1SYY=7f!@c9 zqQ=^gYZ@b1^S=l<^R{La1i@O!p1f3~>>Q&Jof{yO(>?)}x%uei!yb2VWz1^;g)k`z1` z+4|be0ACoBuYUk<8T(Gp-hG_8eVHK$h*Ha>9+o*Og0}|afBWtT!ev8yut`$wBu_9l#F9+?zr+1h$ISx)j zo8*TvleRnK1nyzQv2j6StIkTU>$nS@7qC)VPw$>4u@M3O9+u0Bab$<-g6^GB%&n=8 zaPpj_l}#LB#q?g}odh0arC}Rwqos31D`(}j9V3su!gn_MzK?cH%jm1kqjP2oxnm~J z$=fAbv`x|~OqZ-IQwpy}*Oh9KwRk71V3l;=v|X!WSr~&V5$+0>O}khwtzE%`{A~eH z@klHOEfzwyq9eA`%{|giT{ygd#%Aqh4XaSss>S=s6yL`=fw;nC!!N5PtYQkZYOXZe z!%A2+YKwAhQLhGcwgAv_I$-v3uJ)oXXpxpTndi6h(s=nyvhEiw zB7b#~mW$fG#tK48;Fs|Fqhhmd76*T&D6oEA?U2pidYeKWl5MSMKpkADGjpR`G9LB0m)4?KPezj z@ZOLz{1!64vJX`ibf~3EiuOA~v^l0|r)6!ub$~Of%`1~m3acz`rPa_ zQdl~zV=g*HAD*^p`c3R6yxj`5o7v62bcC>vm$WKN@|EGOyr`|!v07G#$v+RRE(R@R z8}_Qzwv9iJL9WNMtO`e$(??l-?6#nX!{s`COi)vU2jq9TdN@UMplzU! zvklyE!BTM+&{019p1F)TrRpc^#VLj57~W-qw<8EO2RHCjyhqpj@HqAZt-^ZE6sUww zTLIB=xhY^-X!vWjk{+eU@CXudGAGc`j6#pcPZ%X+$2-f$zY|A!UeG7zBWs@iT7$@! z^}Z@xwwfAZ90A0RHOp!v9;zOetfQ-jiRFlR9RpT7N35I8r1JaB6C(==Ef<8^$2TCM zjYw#oAoNMr7_-6M;b!QGJ`S@&JZMgcOQ(DV-ti1Hk9DdyPBsd@8YlHePMEshSHl!$ zWA>1JXfr*@60p3Dmg4bU%QmtG=AlnbCt0WE(@cpi$UL~v{etdi=qcujX#v5mw7?#+ zQanwSe9P$!%j0uVe6!PptHgNzOuADzc$PlL6dE>~&t{apW=+Z$ljiU`#XE1|L^0!e zT0(zd96DPDFGPNP_SuAtcBQ3t*Ul0C0R8Or46kDm+41&+GMtF~_MJC@*pdz7_haCU zB%f;rXfSr3f6BfsS&{-lBYZyHxO%=Cwi{LNzGL6RJ0;PX``&tJkL-TWPoT+ob%AdygAKXSFFMrq!I(29njD&$@pdyHm%*on~>_$w| zUTp@p5-b}BbD+(p4p~dqvNb1jhUGa4 z%WRq=p1<~qBvlF9m~#%8p2(6t7@6VUn9s(EMAgBZm?KudKO^3sd|iK{+0UG&Wg9*q z+R#g^jWs!JXLgoIZRT@e_|@T;RA)Gax>OgF#nT~`$;&X#3eRmOw@M{xBMHP<{?Vtp z+xpd1x?8;7p;oWA&&?z3z8HS}!t2Kx+@AT6?;r8^sJ(;!uAc7x{$SI>p#3SwEj|fd zE$B8^y1s7_u*j8nOiUJ z7%M9&XhN_0(rzvIBL|jt7vJnaaT?4Heqd4U#N#v zqxZsw>{eVoa2Nl4#y_9)&l-@Vk{sh_7v8wL-ARK3{ar)dD#pxjwFbJ?o(H@^tJO2; zSG|6<-DPelZX0XItdn|!T_$p4=wf>EqnQ7}CvdsMWaHSyJ(0I2<|u#c3c}&d7;>jVbU-#C7>6 z0G}DBzdTD4QzD123={ZKlLTAW!KITg zHNeM2PK`df5vGASQlqOI;YB;iOpU&ME4-5k??zwP3Fm;g(xU8k_!!{lQSTiv1n^?? z+?_BA(0p=ND?APxqwluDE&_X^YwiIXKpQ7H~zm9VP*ui9U26e31(K KqGNqX&wl_3@Bgm= delta 3122 zcmb_eYiv}<6`nKuFxc2eV1$j=EbI5$>o?edmjpXbAR!cE0>-IL()NVZOKb3Y!L>8j zH^gx%G$u=K0u*er+g7cVC`qd;_5L8BB8uenN7WWJ32jMfL{sM_h#ECb6h%EVcXw@C zr%I&mYIkPt%$)hocfL92UbyBubj6jmH#0Mx(dX3m*4~$n{yeMlY}Ps&X43Bt&e*_% z=7zJ40Mo|E%YT83#;$Xd>&C>2P;L~$s?~BaC~^<5C=Beyb*bKMb}u{@VKKnl;{Z(c z)*J2TeR_-Pw?w$`jlyY$t&$@Xm)B z-ZkOSiiEF?^#ruy;f10&v@DcQ>tBv|Vg>dn4t>zew31HN=LROfa@55{k&YYk7#$@y zEf*!Y(e9mQlN|4!P*9@K|AJt#EWAe)#rY1}tVYXm6W*JGy_vxHCU|0=z(je^D_W^2 zm3FlC=aJAaHS!gh6!|jLbue(BA(ESC?6_L;q((jKKzQkRRWW&bg@1d zw0Yc;Vzgb9CFd2ZTSfUT;|{W2DEzn@w~cdqMo)NipYVt>n%Zca!0i)G+m}dsEF;de zis2_j8SbD!@bG@&kGZfDE8<+M6qUG>LQYSW@nvMZ3-2Fykgd+3WU5Ho6^^*$ZiXcr znHI1uii%toD~{_-tBRB)4*#kMh$`$JcWc!mkAhOI;vW#put#`sz z*^m?AQo(sZT14C4gA=ZVE2Sb3DT|cv=A+V$UrWHc2-tM=IU;@$7zM3HN)Nv#%0&%{ z?dwu(_zhbLic}}h8ddK$E1QH)u6jAUPo`>6F} zzwpe&PAk_HsPN|scMhR`VVxdJ=+qIuK8H@}DTQ4xBu#xeq5fZWx>JQ}Cfxr^sLt>j zb+hKyX&Da43xN@(*8RrKi%azXR_IoxQ0LI|35B+O359-fftKL`i6xi7NR>LVh!Ucm z?Nch%2X9fSqyMmy!gu7;sI&hf-P?javVx>XD(2MakkV+rtT^CHQwDwb z=er7#gyZ*7 zmnlRMKMEp`7M_h%;}bYO^HgrYqZ3YiGF2~~Q8!f;m;4_-D%FnBnE=}PS+j3JU8shR zt;J(%o&Y41Rbtgzo$xk`3^G+cyqFNz2@nl&o+v)eipr-%vrU#FG@uA|4^ApPzUgIw73N14T0(v_sK-5`Q3?lUktY7bL(&5;u8a zgoPI4DdClS@gSbwJ8^8R+Ah^ucudWAZFos?`>2Aqj zEIeSqM>$62>$T8obiaNXHW{^7Ho-PiTS z-efw{xz8-TW&k{5{Nk^{>?QO%I#0fm(r=&}On7rW6v=#s>5&D(p^99Fa1d;#l(KMa zWBvvE8^CD4{;rw*7IiwNn;_FTGQDQu4YCowDgR1=G5-?d>hyWz=G!?LIzb-TNfYzZ zjqG* zZvOWy>&OPUJP&?q?P`ZtfnUwG8arSbV9fH~2m1hqtmt+)0FZqmtrLzwy7g2iZ06vz qu62P6pv8LYerN*NY%TAGGe9Sv>wyt~UMu(je3%VYR^47$2>%8`2(Wkn diff --git a/mcp_server.py b/mcp_server.py index 9889235d..c0e22a26 100644 --- a/mcp_server.py +++ b/mcp_server.py @@ -2549,8 +2549,15 @@ A股交易时间: 上午 9:30-11:30,下午 13:00-15:00 # 如果没有原生工具调用,尝试从文本内容中解析 if not native_tool_calls and assistant_message.content: content = assistant_message.content - # 检查是否包含工具调用标记 - if '' in content or '```tool_call' in content or '"tool":' in content: + # 检查是否包含工具调用标记(包括 DSML 格式) + has_tool_markers = ( + '' in content or + '```tool_call' in content or + '"tool":' in content or + 'DSML' in content or # DeepSeek DSML 格式 + '|DSML|' in content # 全角竖线版本 + ) + if has_tool_markers: logger.info(f"[Agent Stream] 尝试从文本内容解析工具调用") logger.info(f"[Agent Stream] 内容预览: {content[:500]}") text_tool_calls = self._parse_text_tool_calls(content) @@ -2947,6 +2954,7 @@ A股交易时间: 上午 9:30-11:30,下午 13:00-15:00 支持的格式: 1. value 2. ```tool_call\n{"name": "xxx", "arguments": {...}}\n``` + 3. DeepSeek DSML 格式: <|DSML|function_calls> <|DSML|invoke name="xxx"> <|DSML|parameter name="yyy" string="true">value 返回: [{"name": "tool_name", "arguments": {...}}, ...] """ @@ -3006,6 +3014,47 @@ A股交易时间: 上午 9:30-11:30,下午 13:00-15:00 except: pass + # 格式4: DeepSeek DSML 格式(使用全角竖线 |) + # <|DSML|function_calls> <|DSML|invoke name="search_research_reports"> <|DSML|parameter name="query" string="true">AI概念股 + # 注意:| 是全角字符 + dsml_pattern = r'<[|\|]DSML[|\|]function_calls>(.*?)' + dsml_matches = re.findall(dsml_pattern, content, re.DOTALL) + + for dsml_content in dsml_matches: + # 解析 invoke 标签 + invoke_pattern = r'<[|\|]DSML[|\|]invoke\s+name="(\w+)">(.*?)' + invoke_matches = re.findall(invoke_pattern, dsml_content, re.DOTALL) + + for func_name, params_str in invoke_matches: + arguments = {} + # 解析参数: <|DSML|parameter name="xxx" string="true/false">value + param_pattern = r'<[|\|]DSML[|\|]parameter\s+name="(\w+)"\s+string="(true|false)">(.*?)' + param_matches = re.findall(param_pattern, params_str, re.DOTALL) + + for param_name, is_string, param_value in param_matches: + param_value = param_value.strip() + if is_string == "false": + # 不是字符串,尝试解析为数字或 JSON + try: + arguments[param_name] = json.loads(param_value) + except: + # 尝试转为整数或浮点数 + try: + arguments[param_name] = int(param_value) + except: + try: + arguments[param_name] = float(param_value) + except: + arguments[param_name] = param_value + else: + # 是字符串 + arguments[param_name] = param_value + + tool_calls.append({ + "name": func_name, + "arguments": arguments + }) + logger.info(f"[Text Tool Call] 解析到 {len(tool_calls)} 个工具调用: {tool_calls}") return tool_calls