From 9ec7d2f686448e957d2afd997e05e78c2d7dca8b Mon Sep 17 00:00:00 2001 From: yumoqing Date: Sat, 9 Aug 2025 13:18:29 +0800 Subject: [PATCH] bugfix --- llmage/init.py | 10 ++++- llmage/llmclient.py | 43 ++++++++++++++++++++- models/llmcatelog.xlsx | Bin 16525 -> 16635 bytes wwwroot/llm_dialog.ui | 30 +++++++++++++++ wwwroot/llminference.dspy | 2 + wwwroot/show_llms.ui | 76 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 wwwroot/llm_dialog.ui create mode 100644 wwwroot/llminference.dspy create mode 100644 wwwroot/show_llms.ui diff --git a/llmage/init.py b/llmage/init.py index f257362..1df2b95 100644 --- a/llmage/init.py +++ b/llmage/init.py @@ -1,3 +1,11 @@ +from llmage.llmclient import get_llm, inference, get_llmcatelogs, \ + get_llms_by_catelog +from ahserver.serverenv import ServerEnv def load_llmage(): - pass + env = ServerEnv() + env.get_llm = get_llm + env.inference = inference + env.get_llms_by_catelog = get_llms_by_catelog + eng.get_llmcatelogs = get_llmcatelogs + diff --git a/llmage/llmclient.py b/llmage/llmclient.py index 083961c..e480291 100644 --- a/llmage/llmclient.py +++ b/llmage/llmclient.py @@ -1,8 +1,49 @@ from traceback import format_exc +from sqlor.dbpools import DBPools from appPublic.log import debug, exception -from uapi.appapi import UAPI +from uapi.appapi import UAPI, sor_get_callerid, sor_get_uapi from ahserver.serverenv get_serverenv +async def get_llmcatelogs(): + db = DBPools() + dbname = get_serverenv('get_module_dbname')('llmage') + async with db.sqlorContext(dbname) as sor: + recs = await sor.R('llmcatelog', {}) + return recs + + return [] + +async def get_llms_by_catelog(catelogid): + db = DBPools() + dbname = get_serverenv('get_module_dbname')('llmage') + async with db.sqlorContext(dbname) as sor: + recs = await sor.R('llm', {'catelogid': catelogid}) + return recs + return [] + +async def get_llm(llmid): + db = DBPools() + dbname = get_serverenv('get_module_dbname')('llmage') + async with db.sqlorContext(dbname) as sor: + sql = """select a.*, +b.input_view, b.output_view, b.system_message, +b.user_message, +b.assisant_message from llm a, llmcatelog b +where a.catelogid = b.id + and a.id = ${llmid}$""" + recs = await sor.sqlExe(sql, {'llmid': llmid}) + if len(recs) > 0: + r = recs[0] + apis = await sor_get_uapi(sor, r.upappid, r.apiname) + if len(apis) == 0: + e = Exception(f'{r.upappid=},{r.apiname=} uapi not found') + exception(f'{e=}\n{format_exc()}') + raise e + api = apis[0] + r.inputfields = api.paramsdesc + return recs[0] + return None + async def inference(request, env): uapi = UAPI(request, env) params = env.params_kw diff --git a/models/llmcatelog.xlsx b/models/llmcatelog.xlsx index ad1c25932db81808ea6e9f5dfb6bedcb745b0810..544be489e33312e377f89c871cec35be541564fe 100644 GIT binary patch delta 3056 zcmZ8jXH*ji5>6rnLXA`nB|#xHF@%7GVgiP;AWaAuEJ$BUB2C(YWC?;a5ecA>kQEdn zy`!LlNKpiq2%>aQKokr`rAIi=w|DQ}&5xOR-#6czKQr^@Mm%sg9$4cJ;V+$OcAujA zK-8%aj#LiOzdj(RNquZ*jbt#xR}OX>pCdT$?^Y=(>y8rM6?Jw`EOj(*Dpn1k-X;d; z+V~&u<+~**Zct(4)7@)MTfSU9sTA5!=wp$1%$0V+=3d(Ccc=x;QkJhH&H&)B$T#0j zM0XqZyPB@2RFELK%|w2^8lrH8W|v<{7+q9IhHGu}pnKU0-eqrW^O7M|aWiZccORhHG}n}5n`GP_i|u{n;YzdfP(MrFN0?=lmG|Zg*GPQW zCS0>LGO(9Ec6YkUYBisF~z^X&BMhGQA0gL?ZD<$kV zb9R+xwAF&7t<{pK?qRU-84iC(V&5GO^${EY$FYrl2ZSvJq|G-e5x62Q3E&YYO34A) z2R8NT@XXKnE0E~xi@xInU%QbJtE3VQhF?Z&^OpnHI?6`ag*p?`{0n&KY&1JZp-kPKGrN z?tU0Au8*7XL7s)cqB;{EoS4k#^A=ok_KKUy>yexjzy6keb)#U-T#VV{>aO4)u$47A zc-XksbSu}NHl@vM5UGA2%3V!TT0TP_Lpo4=+2s3GOCZjoccV^ZN;S1LY&}t^f(Yu5^YaA!__=_;-h4>v1L@(Yl!=a4bhbmr6Ri-#5Dpi$EC#<`(K@DTyvq8x>!n;08>GEspau`Y3 zV{6{**CA9#SRyQ#@>`}%s%_06C4qI0ooQ4uP>UO%2Q(v@=LiG#M%IF!q8Fb_ee&dR zbRSfWiYPRm9??}fJY-YaV^&przNi(sSTBH??%YTvQOs7(ZnTo`M|TaTB`j!dH)+V` zwndh7b>=>Z=zN%x(A9J&2s!nm%U5@^<}oPMvWbf8$qP>$`zsFNb~&{NQV_NbeK(TI z(vK|vmKyzV$NCM@oLyFUJ}e}|Qiar_HGRd5UA3;_w%2~yF`*lyevXubVQ4s4hFnkI z4P=CFq})2|e2j&&drZvt?KaD=%CeR%c6Mwn(yo`cdZRU0qf&45dax<==2Yc=QJN9) z(l|8`mBt?GK5BI$cb-Q>uEmC}EM*ru)zyY`Mr=9`qEAoVUV3_K>2XxO{_Xw}FA1dU z?gIl{W6|yOHjRlhf2xTMtpevs zsPIzD-43{HrmK^#i8+OCVQatO6#;e44;G2$=BV?NopvuJm#Va;?HTdkc=$OPokQtS znP>;Q5oYn>aT@-rF;|u0e4b^HuwO58v1()7#(^XLS<-6C9SA(@uXJ!bah*X+Wj#@XKuf4 zwRIN|Kn;?Iqp8ZKwX z?Qdwe6n6@okv%mI3*7;+rnIKo7%LU$cZCp8*XK~ykv{X zdaIjE(x`lXTDZ9L<>*jZlie}Bw@(-HGQC$;ZPr>ADP!vx)qD5rr*b{gy(3<3KjEn} zbd&@JqkqVHM0LxPohP0h)wp`zn)io0wb*iGSk8kEl)>L-P>8pN@K%xO!5>3@vw+;} z=vlLt{dVfT*o(5{1RXYf>r06BsOQwifH=PqRf3Ml9k^=>HW9b$2@345mkL?h5UX8&6f)9=Jho;)^}Meou~7 z5Zbspx$)8*>gOfi-~Z*VQHk6Pnl?06dPvs9q%i-KXYbV~U^H@XFb%r0KAClTRN?k4 zyicU>OT;tLcfCGec4~trXZIdQ>mv0T@7ZmlSHc@g!WRTtf(mjN&X4-ZmM^0%UwAK~ z|DMkhW{z7`%}%(5!kOjDn?23vLN77vvvxmDD1{vEFGxbYc@MGepq|a_eqjmo+P}rO z7b`Ztl82Jd}lJD*M&HItZPXzpaRpc*x z_X>mkt~Ef-`Jtwmnms>z0uVMfcfHAW&3ifGEPClgTz@fN2=$eImK-JgGi{+R+g6@d z$xr_}gS&0{TR`Bmob^@gms3L9Q{v!J^# zA!&bM$0^gmR>JT!vQrqb5_XB2!IP^`Hsk^S`F&H29YGgG=s*o=`d4EVh$#Lm#hyfg z`Xqj(aVJqg9eUMC6Of_8FMuB>E%*P=#m|BM$GqrzI8)#jJrZXKf~(W_)l}#sI1P}J z#!oGbu84=q|Mw1x0sx2pBl{KQj{j-^JPn9JGseba8B8UY33I!7+zP%u6WH z_R&asZW`_U{M9cSfo+dH^%G_7;*cigqkS`%xMiw~Z&+%m0?apQ*WXynzfl{r)22MC zvt`QZw5C&TvSzN68Ms*)L|_2|aqqcAZFc+c2dZYD3@StVj9Td|Ow4HxL&jz1%b?#Q zmVh z%fc)dzdAOZ)CUXNV|#D9$-wcjD&%T9e-8YcKu+KQnDwtAixB0yPJoPP@#2;6rrZPT zK5B0q9ApJoCfVoEKWQ&Nv$Ip4o#~`yNA-RR8iU6BF^JPHzcQH28$Zm-|5BZ8z}7R# zCcMD;uH&<-D6q@51J4V=@r4~;F&j7&20p1a1tgU|C$|3_WCBD>-@zi4M`BM3-m?xJ z3U?)RV?tWzz3zHI_|wV=BZ+i)KzMz8(E+SnVdN{gTCH-e&F4`HjL95Z~GY zzy0jOoaPT_%f42f%Er)8+9JU|GFU}<$zSCa=47@%`P@GVR=Fw|+8r^tpbEhb&P2cV z&9i_lAkk9L@7AiJ-uvuH=w9vq?YqiH%mi&k&eq!?dML0ohLc^21^}>TB1DMt;RnnMF<+$Dq3r!I!P}75xHMHa6>Xp` zt6Lg-u9G+aW6i}s)FERBlow8lSd9F=@N=P{=dOZ@)vO+m@h>eoZ`=kZeo1GGWDfl>%G!u)nxk=9sk3*yO73 z)tN4Iwlm1%ZVUVjZi!J89^{MBHeu!%=$4arH2~J-=_d@lmr$~HTX6&7iia#s@)(42 zY(d_3c*N!L9R*1tj*CXkb}?wfAVyk~HnU6+k87%!9y1d*_GzQPch##MA~{Z6h$B%{ zqEjPqeJ!Qq<#YbvESbT6m|dSZb=l7z~NS#?(+p*~(qvVKs@XafiHV z??)*tA??lE?|E+QpJ*56`t@$rx1E~7ajoQXtL1f=^XA?`px;*3Ou=uTuv*@_-gFzS zy`y>zF2tp@E1NsAe2jZUVdEHZ4F$Bx=dS2-?YZ!BBaOM+Dib$RPcdJ`QXeRu4T5*A zD|!+}OYZAdWQSQcb#67bCt6nr(7f4ko^y#PUxPvq)@R6B`05)Z2Z*XvB)c+U>#R zdsTA6hAf&!88{Plp{sBLSusiiM=r=x@u7S70P4H+(a7Il;>KhzJ=qWM?tv{y9Fkif zQBWDoVv6Uu)oc2V58Q&yjozbV;cP9Hx=YN>_{G`>E4|nwxqjA1{K(1Wk5-~13s7c5 z2Azwl9=Q4Z{#DeRw&K)>4_Gu@lXClMLgt$&LrK)KOR4D%F9no+$DskIUvsLgIH5jm zVs7WdkmHMTi;a142h-0!2a}~oe$)QrAi{_STPqhF!USH}>e}q51pp8r0DuQTc!-7) zOfE9v=0rG?b|tqpMRp+RTV1A{Pixe$+ha=gCmj+;D*9BbRJT5up6sGk+O4EMaD8l{ z^5}gR0T$r898o^3sM6?TWv*d*Ay)shrSeu>^m(XeXC;y0eU{D~J@A;ictKV(+Llx| zcf=>cCa%;|8p60;D1YfT;FjEm`jbTmbL?ye` z8W|p4U!T^3fY})AY10>HYA7^gLqY!f9b@f92Dj~X>#}T?E8;EP*G>cGZ6$5^4i*kf z3|hj%pB_1akn^W01d9)Lezgca1r#wd|15nh4-fmUbl!?k_W&1Tzr2D;N4XfB242Ti zT$vp}x&2~H8(shEfaN+g```j0-Sx>deC=`Y_1HK!&2kw$Sa&bJru2E_8Q!YhF_?0I z=^O9mC5YIVm1@&#v0feayFEtW4A?q?a#4=XRJoq)czLil*3IjFfdL_h6hVn&An%mo zm)JLpenILCz2JwzZcXy{*H=`8+`DkQBWGzandRm2&5|0Ba=yDb+}gdiKOhh}9`)=6 zgZY-)QiI_P_VS z^ZYgve~TEN!#X$Nv#gnTYD_&d-FAw>WpYk@}(Q~E(0M5?=|Fi@gVGA6G042I4 zlIZBu3vS?t_V)P_@JGfhY>`nY_c!*bXYtWqg_8~6$O}KMCa?NdByXU2jM!6LBcDBB zFTS5x73`HJS#`C7XE~}tM{dJtbZ6ANL@$rG1fHj?VJwe2k?kj~vZwd=;LL8BD%?lbVW2s%g;g15aotmEB@l`_liKpDC6JA&C~sEkbhQFyXmSWr2Nak}eLnqjVhv0xKp6}NI6@=ZbxjJSxr zvz1n@&q@FZ_LX`@M`gDpAu5*jYU$gcuIg7ZlbR$jsN4K;&2FfwYNkSrTC;Um<#fhh zxHSHeAHmEj;C|W}SE;8tE8uUJVeCct!i=G>R@cxmiXiBeNPV9L+p=&Yol}7(_g|hX zb%|(X!=%(s*4QVJ`#bUM<;}ixr9~8Z$1}#>#uDd~njZXoJx{6ndOCt-O1fxw4mm*R zeBq>*;q*c=m-^_pybE(>wnYV{c+?VMyoaO@PQ~#HK5vwN6&rDphu6C>`}wDSk7k{_ z0{TIkCZ`uJmN{_1#X*`~0^BD~6U&b^Dt_hipjKXMr|sQ;3kign-Sg5~*yuSGAjk`H zw*pb$sQ&wc{#3W5b^!ee7+3TqDoX+$tw%k=@dqIN4Il^t8d}sUf`5P@4XD7s_Z z{9Bg)mYXO6C(1?W(vYU=Cai0yQLkPgh-#WquS@+QCu>3l{y*0Kr2+tpa(|Y_G%r!l uDiF>zHK{lW8d@;^KPvd!0=K9E0QUbS0H_I(S{hXM2`{wN=vz?#jQ#_NpHH;_ diff --git a/wwwroot/llm_dialog.ui b/wwwroot/llm_dialog.ui new file mode 100644 index 0000000..5bb9eea --- /dev/null +++ b/wwwroot/llm_dialog.ui @@ -0,0 +1,30 @@ +{% set llm = get_llm(params_kw.id) %} +{% if llm %} +{ + "widgettype":"LlmIO", + "options":{ + "width":"100%", + "height":"100%", + "list_models_url":"{{entire_url('list_mti_models.dspy')}}", + "estimate_url":"/estimate/model_estimate.dspy", + "input_fields":{{llm.input_fields}}, + "input_view":{{llm.input_view}}, + "models":[ + { + "llmidid":"{{llm.id}}", + "modeltypeid":"{{llm.catelogid}}", + "output_view":{{llm.output_view}}, + "input_from":"userinput", + "system_message_format":{{llm.system_message}}, + "user_message_format":{{llm.user_message}}, + "llm_message_format":{{llm.assisant_message}}, + "icon":"{{entire_url('/appbase/get_icon.dspy')}}?id={{llm.iconid}}", + "url":"{{entire_url('/llmage/llminference.dspy')}}", + "model":"{{llm.model}}", + "modelname":"{{llm.name}}" + } + ] + } +} +{% else %} +{% endif %} diff --git a/wwwroot/llminference.dspy b/wwwroot/llminference.dspy new file mode 100644 index 0000000..05d4c8f --- /dev/null +++ b/wwwroot/llminference.dspy @@ -0,0 +1,2 @@ +env = DictObject(**globals()) +return inference(request, env=env) diff --git a/wwwroot/show_llms.ui b/wwwroot/show_llms.ui new file mode 100644 index 0000000..559d491 --- /dev/null +++ b/wwwroot/show_llms.ui @@ -0,0 +1,76 @@ +{ + "widgettype":"VBox", + "options":{ + "width":"100%", + "height":"100%" + }, + "subwidgets":[ +{% for cate in get_llmcatelogs() %} + { + "widgettype": "VBox", + "options":{ + "width":"100%" + }, + "subwidgets":[ + { + "widgettype":"Title3", + "options":{ + "text":"{{cate.name}}" + } + }, + { + "widgettype":"DynamicColumn", + "options":{ + "css":"filler", + "width":"100%" + }, + "subwidgets":[ +{% for llm in get_llms_by_catelog(cate.id) %} + { + "widgettype":"VBox", + "options":{ + "cwidth":16, + "cheight":8 + }, + "subwidgets":[ + { + "widgettype":"Title5", + "options":{"text":"{{llm.name}}" + }, + { + "widgettype":"Text", + "options":{ + "text":"{{llm.description}}", + "wrap":true, + "halign":"left" + } + } + ], + "binds":[ + { + "wid":"self", + "event":"click", + "actiontype":"urlwidget", + "target":"PopupWindow", + "popup_options":{ + "width":"90%", + "height":"90%" + }, + "options":{ + "params":{ + "id":"{{llm.id}}" + }, + "url":"{{entire_url('./llminference.dspy')}}" + } + } + ] + } +{% if not loop.last %}, {% endif %} +{% endfor %} + ] + } + ] + } +{% endfor %} + ] +}