From 85565644556de0406e25cd00e1456211d0945d66 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 7 Jul 2026 18:02:57 +0800 Subject: [PATCH] chore: remove llm_metrics and user_llm_policy from git tracking These are generated CRUD files, not source code. --- .gitignore | 4 + llmage/.product_interface.py.swp | Bin 16384 -> 0 bytes wwwroot/llm_metrics/add_llm_metrics.dspy | 55 ---- wwwroot/llm_metrics/delete_llm_metrics.dspy | 47 --- wwwroot/llm_metrics/get_llm_metrics.dspy | 76 ----- wwwroot/llm_metrics/index.ui | 301 ------------------ wwwroot/llm_metrics/update_llm_metrics.dspy | 78 ----- .../user_llm_policy/add_user_llm_policy.dspy | 55 ---- .../delete_user_llm_policy.dspy | 47 --- .../user_llm_policy/get_user_llm_policy.dspy | 76 ----- wwwroot/user_llm_policy/index.ui | 292 ----------------- .../update_user_llm_policy.dspy | 78 ----- 12 files changed, 4 insertions(+), 1105 deletions(-) delete mode 100644 llmage/.product_interface.py.swp delete mode 100644 wwwroot/llm_metrics/add_llm_metrics.dspy delete mode 100644 wwwroot/llm_metrics/delete_llm_metrics.dspy delete mode 100644 wwwroot/llm_metrics/get_llm_metrics.dspy delete mode 100644 wwwroot/llm_metrics/index.ui delete mode 100644 wwwroot/llm_metrics/update_llm_metrics.dspy delete mode 100644 wwwroot/user_llm_policy/add_user_llm_policy.dspy delete mode 100644 wwwroot/user_llm_policy/delete_user_llm_policy.dspy delete mode 100644 wwwroot/user_llm_policy/get_user_llm_policy.dspy delete mode 100644 wwwroot/user_llm_policy/index.ui delete mode 100644 wwwroot/user_llm_policy/update_user_llm_policy.dspy diff --git a/.gitignore b/.gitignore index 8fd57b9..021a214 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,7 @@ wwwroot/llmusage_accounting_failed/ !wwwroot/llmusage_accounting_failed/recover_usages.dspy wwwroot/llmusage_history/ build/ + +# Generated CRUD files (managed by xls2ddl/build.sh, not tracked in git) +wwwroot/llm_metrics/ +wwwroot/user_llm_policy/ diff --git a/llmage/.product_interface.py.swp b/llmage/.product_interface.py.swp deleted file mode 100644 index f3544fa751460866dea03dae75e8ea3bf990d25a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI2ZHygN8OKMlzN3f+h@TF-#JP*x+igh<-DJ_i7F-Fn>5E^gUe294vpenFJJXrD zyIs}-tu1}Qwj|OQYbi98wm`cDg|uujO$>ff2+_pE7)4_D-rdF+l!z&bZ~y0-xuF)B_oUU?Y>3<{0-u_zxxx7)ky=(DwiD2zXd13cJOV`0WMr=7_Wi}a0L7SJOBbv0(XJ| za0BQB9pLRx8pe;ocCZmF1Gj>=K4BQIgFk@Rz&O|pHi3J<@{t@T_>;rqjCcwd0K{vSY zVZ-*%_;DI$@Ik*M<6@B>^@CrBu#=!>Q0P5#!!E6^xE?bmqg9XR5hJ>}I zq(9W)!`$_F+4bCbw3h{eYxj-ela31{EgOSt5wpV)^I# zRmLMGdSw(v^AYaGOjL)9gCZ_bL8wg@QqU!sdzAB-*=n6$#3#)9*OxofJvzOh@y-0L3GZZ}Xs|YX~dmpQh@1Hz# zsSKrM2Oq4T`qAX+ z2d5^^Hmjqm@WoABi`eyj%nWK}&y9wJZMN2}lFU-=im=w&;ASMnWukSx%Z2C6r6e}1__pwR8TUr`Xv9(-&mzqX{fjV6wTydJ5!&C)@Pyu1 zqox#!$oGat2{8q_uZ5OCpaap>sOaeEkex*x*4pJ|-}kaT9>qzG%j5uwdYd9=Tg;{& zKGxWJYU<3UsWV#!`rmkQ>-3hV8V9yDRHtp;(Rlp+H(uP9R@x?2FPnaTQ)A*GO8&^+ z`U9KKfA^RyrBABawRPS_;h+`)Z9t)oN1vFSI9mVyhQ_{=^@onscb$YJs6IPNRTN3H zdn*b$cmGC%N267X*}`F$p2_X1>(2IZ-x9wnx}Xi&B-JUTO;fCkLyk|k93S(g`Ouv< z-Av|j$rdrp22!;KTqI?Tax&@YF_S8)S(b<*B#@(5R-~u%4Dpf?i^Mc-lBY~z7LSGJ z4a9U@NK&14H@1Vz%NM-f#@+0+b}JbS3I;bdd~#>vw=)Z|db zsXPo*KrLu;l~D^!$#$c_^8Ok({gl;U`S)*aC zOnVyU`YM1l5(nHWmAOaXO*cd34uhhaL1;qDL!!s-M5-HKS5t< zzDCR(iFz|9m%&)p=~j3+%CHZ>NOD~CkugvSJW;_jRZenXugx)Fb&XoU^y7H7J|&;b zS9ld8g0dHJ5R}u5ElpZ>mulI7{;Hm(RmoLeYJ$%HKf@XKNt}V{{IB1?zl8JtF!&1i zGFSlqj5GdG@F?)W-Jl5Og6qJ`IM4qAJP(co7c2n<@EXqazXv}DFM!9u2Cy333BCpj z;4|QDoav{*ad0nK4OW5`;5P6D@D|SUKLrQDcfe9`JD@ZFjo?kRhuU2)JBc%7di>DT_}=>AXQ!WgLb))Sj=OZHOx}I&Sv3#4 z_|(I1`4PPFVF=&N>^^)Wk&QJ=r;zkqjji@z$Sd&1;v9`ls(eqNPBl6w`8(wKN}jaU zZCeTw39%tgVRnHYy4ja9UO8DKuh1DSO{E^$jX1m~Mb6CPhb|6q+$&u)??vip^C=j* z3A$%4;=JQglqRF(O82eq8(j?PN4qJr4%nveO{dh2N{`w&>B+YzRt=|_3cU9^MZwT{ z=s)%O&;yR{S--YHVRY%ND13gg$B<$8>12z7z#C<{iZtEKR?8vuMfkjmbeEPuC6V_^ zhPJ98=`NW^-KV*vPfi`kTsVK5`D879tSMnq2nD6NsZM>FO`lWiG?_m8aQ%k|@n%Q9 z0r_O}bPe&ejI`Gp= zEY<&M-~F%tw##|5mA3Da8ekdiz84-n_~n%qa6F%ri%t(yOnDuoy?HHGCw;9$T{M>I zxx_D+PJUg=OtYY3qz;z7%XdR~MKd|Ev$1_&W835U%?=6D>|Nzw?55XB=eO)??0%-P qW1JPxgh~Ksk-tV%qi$y5$rI#pNP^hZiET~0pgji3o3D5Dj_E(kjCLyk diff --git a/wwwroot/llm_metrics/add_llm_metrics.dspy b/wwwroot/llm_metrics/add_llm_metrics.dspy deleted file mode 100644 index 86bf155..0000000 --- a/wwwroot/llm_metrics/add_llm_metrics.dspy +++ /dev/null @@ -1,55 +0,0 @@ - -ns = params_kw.copy() -for k,v in ns.items(): - if v == 'NaN' or v == 'null': - ns[k] = None -id = params_kw.id -if not id or len(id) > 32: - id = uuid() -ns['id'] = id - - - -userorgid = await get_userorgid() -if not userorgid: - return { - "widgettype":"Error", - "options":{ - "title":"Authorization Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"Please login" - } - } -ns['userorgid'] = userorgid - - -db = DBPools() -dbname = get_module_dbname('llmage') -async with db.sqlorContext(dbname) as sor: - r = await sor.C('llm_metrics', ns.copy()) - _new_rows = await sor.sqlExe("SELECT * FROM llm_metrics WHERE id = ${id}$", {'id': id}) - _user_data = _new_rows[0] if _new_rows else ns - return { - "widgettype":"Message", - "options":{ - "cwidth":16, - "cheight":9, - "title":"Add Success", - "timeout":3, - "message":"ok", - "user_data": _user_data - } - } - -return { - "widgettype":"Error", - "options":{ - "title":"Add Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"failed" - } -} \ No newline at end of file diff --git a/wwwroot/llm_metrics/delete_llm_metrics.dspy b/wwwroot/llm_metrics/delete_llm_metrics.dspy deleted file mode 100644 index faff46f..0000000 --- a/wwwroot/llm_metrics/delete_llm_metrics.dspy +++ /dev/null @@ -1,47 +0,0 @@ - -ns = { - 'id':params_kw['id'], -} - - -userorgid = await get_userorgid() -if not userorgid: - return { - "widgettype":"Error", - "options":{ - "title":"Authorization Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"Please login" - } - } -ns['userorgid'] = userorgid - -db = DBPools() -dbname = get_module_dbname('llmage') -async with db.sqlorContext(dbname) as sor: - r = await sor.D('llm_metrics', ns) - debug('delete success'); - return { - "widgettype":"Message", - "options":{ - "title":"Delete Success", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"ok" - } - } - -debug('Delete failed'); -return { - "widgettype":"Error", - "options":{ - "title":"Delete Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"failed" - } -} \ No newline at end of file diff --git a/wwwroot/llm_metrics/get_llm_metrics.dspy b/wwwroot/llm_metrics/get_llm_metrics.dspy deleted file mode 100644 index d2b023d..0000000 --- a/wwwroot/llm_metrics/get_llm_metrics.dspy +++ /dev/null @@ -1,76 +0,0 @@ - -ns = params_kw.copy() - - -userorgid = await get_userorgid() -if not userorgid: - return { - "widgettype":"Error", - "options":{ - "title":"Authorization Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"Please login" - } - } -ns['userorgid'] = userorgid -ns['userorgid'] = userorgid - -debug(f'get_llm_metrics.dspy:{ns=}') -if not ns.get('page'): - ns['page'] = 1 -if not ns.get('sort'): - - - ns['sort'] = 'use_time' - - - -sql = '''select a.*, b.userid_text, c.llmid_text, d.userorgid_text -from (select * from llm_metrics where 1=1 [[filterstr]]) a left join (select id as userid, - username as userid_text from users where 1 = 1) b on a.userid = b.userid left join (select id as llmid, - model as llmid_text from llm where 1 = 1) c on a.llmid = c.llmid left join (select id as userorgid, - orgname as userorgid_text from organization where 1 = 1) d on a.userorgid = d.userorgid''' - - -filterjson = json.loads('{"AND":[{"field":"userorgid","op":"=","var":"userorgid"},{"field":"use_date","op":"between","var":"use_date"}]}') - - -# 确保 logined 过滤条件始终生效 -if filterjson: - if not isinstance(filterjson, dict) or 'AND' not in filterjson: - filterjson = {'AND': [filterjson] if filterjson else []} - - filterjson['AND'].append({'field': 'userorgid', 'op': '=', 'var': '__logined_orgid__'}) - ns['__logined_orgid__'] = userorgid - - - -filterdic = ns.copy() -filterdic['filterstr'] = '' -filterdic['userorgid'] = '${userorgid}$' -filterdic['userid'] = '${userid}$' -if filterjson: - dbf = DBFilter(filterjson) - conds = dbf.gen(ns) - if conds: - ns.update(dbf.consts) - conds = f' and {conds}' - filterdic['filterstr'] = conds -ac = ArgsConvert('[[', ']]') -vars = ac.findAllVariables(sql) -NameSpace = {v:'${' + v + '}$' for v in vars if v != 'filterstr' } -filterdic.update(NameSpace) -sql = ac.convert(sql, filterdic) - -debug(f'{sql=}') -db = DBPools() -dbname = get_module_dbname('llmage') -async with db.sqlorContext(dbname) as sor: - r = await sor.sqlPaging(sql, ns) - return r -return { - "total":0, - "rows":[] -} \ No newline at end of file diff --git a/wwwroot/llm_metrics/index.ui b/wwwroot/llm_metrics/index.ui deleted file mode 100644 index f48439c..0000000 --- a/wwwroot/llm_metrics/index.ui +++ /dev/null @@ -1,301 +0,0 @@ - -{ - "widgettype":"VBox", - "options":{"height":"100%","width":"100%"}, - "subwidgets":[ -{ - "id":"llm_metrics_tbl", - "widgettype":"Tabular", - "options":{ - "width":"100%", - "height":"100%", - - - "title":"模型使用指标", - - - - - "toolbar":{ - "tools": [ - { - "name": "filter", - "label": "搜索" - } - ] -}, - - "css":"card", - - - "editable":{ - - "new_data_url":"{{entire_url('add_llm_metrics.dspy')}}", - - - "delete_data_url":"{{entire_url('delete_llm_metrics.dspy')}}", - - - "update_data_url":"{{entire_url('update_llm_metrics.dspy')}}" - - - }, - - - "data_url":"{{entire_url('./get_llm_metrics.dspy')}}", - - "data_method":"GET", - "data_params":{{json.dumps(params_kw, indent=4, ensure_ascii=False)}}, - "row_options":{ - - - - "browserfields": { - "exclouded": [ - "id", - "taskid" - ], - "cwidth": {}, - "alters": null -}, - - - "editexclouded":[ - "id", - "amount", - "responsed_seconds", - "finish_seconds", - "status", - "taskid" -], - - "fields":[ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "id" - }, - { - "name": "userid", - "title": "用户id", - "type": "str", - "length": 32, - "label": "用户id", - "uitype": "code", - "valueField": "userid", - "textField": "userid_text", - "params": { - "dbname": "{{get_module_dbname('llmage')}}", - "table": "users", - "tblvalue": "id", - "tbltext": "username", - "valueField": "userid", - "textField": "userid_text" - }, - "dataurl": "{{entire_url('/appbase/get_code.dspy')}}" - }, - { - "name": "userorgid", - "title": "用户机构", - "type": "str", - "length": 32, - "label": "用户机构", - "uitype": "code", - "valueField": "userorgid", - "textField": "userorgid_text", - "params": { - "dbname": "{{get_module_dbname('llmage')}}", - "table": "organization", - "tblvalue": "id", - "tbltext": "orgname", - "valueField": "userorgid", - "textField": "userorgid_text" - }, - "dataurl": "{{entire_url('/appbase/get_code.dspy')}}" - }, - { - "name": "llmid", - "title": "模型", - "type": "str", - "length": 32, - "label": "模型", - "uitype": "code", - "valueField": "llmid", - "textField": "llmid_text", - "params": { - "dbname": "{{get_module_dbname('llmage')}}", - "table": "llm", - "tblvalue": "id", - "tbltext": "model", - "valueField": "llmid", - "textField": "llmid_text" - }, - "dataurl": "{{entire_url('/appbase/get_code.dspy')}}" - }, - { - "name": "use_date", - "title": "使用日期", - "type": "date", - "length": 0, - "uitype": "date", - "datatype": "date", - "label": "使用日期" - }, - { - "name": "use_time", - "title": "使用时间", - "type": "timestamp", - "length": 0, - "uitype": "str", - "datatype": "timestamp", - "label": "使用时间" - }, - { - "name": "input_tokens", - "title": "输入tokens", - "type": "int", - "default": "0", - "length": 0, - "uitype": "int", - "datatype": "int", - "label": "输入tokens" - }, - { - "name": "output_tokens", - "title": "输出tokens", - "type": "int", - "default": "0", - "length": 0, - "uitype": "int", - "datatype": "int", - "label": "输出tokens" - }, - { - "name": "total_tokens", - "title": "总tokens", - "type": "int", - "default": "0", - "length": 0, - "uitype": "int", - "datatype": "int", - "label": "总tokens" - }, - { - "name": "amount", - "title": "金额", - "type": "float", - "length": 18, - "dec": 4, - "default": "0", - "cwidth": 18, - "uitype": "float", - "datatype": "float", - "label": "金额" - }, - { - "name": "responsed_seconds", - "title": "响应时长(秒)", - "type": "float", - "length": 18, - "dec": 2, - "nullable": true, - "cwidth": 18, - "uitype": "float", - "datatype": "float", - "label": "响应时长(秒)" - }, - { - "name": "finish_seconds", - "title": "完成时长(秒)", - "type": "float", - "length": 18, - "dec": 2, - "nullable": true, - "cwidth": 18, - "uitype": "float", - "datatype": "float", - "label": "完成时长(秒)" - }, - { - "name": "status", - "title": "状态", - "type": "str", - "length": 32, - "nullable": true, - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "状态" - }, - { - "name": "taskid", - "title": "任务号", - "type": "str", - "length": 32, - "nullable": true, - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "任务号" - } -] - }, - - - - "search_form":{ - "css":"card", - "padding":"8px", - "show_label":false, - "submit_label":"搜索", - "submit_css":"primary", - "fields":[ - { - "name": "userorgid", - "uitype": "code", - "placeholder": "用户机构", - "cwidth": 15, - "valueField": "userorgid", - "textField": "userorgid_text", - "params": { - "dbname": "{{get_module_dbname('llmage')}}", - "table": "organization", - "tblvalue": "id", - "tbltext": "orgname", - "valueField": "userorgid", - "textField": "userorgid_text" - }, - "dataurl": "{{entire_url('/appbase/get_code.dspy')}}?prepend_all=1" - }, - { - "name": "use_date", - "uitype": "date", - "placeholder": "使用日期", - "cwidth": 15 - } -] - }, - - - "filter_labels":{ - "use_date": "使用日期" -}, - - - "filter_title":"查询条件", - - - - "page_rows":160, - "cache_limit":5 - } - - ,"binds":[] - -}] -} \ No newline at end of file diff --git a/wwwroot/llm_metrics/update_llm_metrics.dspy b/wwwroot/llm_metrics/update_llm_metrics.dspy deleted file mode 100644 index 4e4711b..0000000 --- a/wwwroot/llm_metrics/update_llm_metrics.dspy +++ /dev/null @@ -1,78 +0,0 @@ - -ns = params_kw.copy() -for k,v in list(ns.items()): - if v == 'NaN' or v == 'null' or v == '' or v is None: - if k != 'id': - del ns[k] - else: - ns[k] = None if v in ('NaN', 'null') else v - - -userorgid = await get_userorgid() -if not userorgid: - return { - "widgettype":"Error", - "options":{ - "title":"Authorization Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"Please login" - } - } -ns['userorgid'] = userorgid - - - - -db = DBPools() -dbname = get_module_dbname('llmage') -async with db.sqlorContext(dbname) as sor: - - ns1 = { - - "userorgid": userorgid, - - - "id": params_kw.id - } - recs = await sor.R('llm_metrics', ns1) - if len(recs) < 1: - return { - "widgettype":"Error", - "options":{ - "title":"Update Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"Record no exist or with wrong ownership" - } - } - - tblfields = json.loads('[{"name":"id","title":"id","type":"str","length":32},{"name":"userid","title":"用户id","type":"str","length":32},{"name":"userorgid","title":"用户机构","type":"str","length":32},{"name":"llmid","title":"模型","type":"str","length":32},{"name":"use_date","title":"使用日期","type":"date"},{"name":"use_time","title":"使用时间","type":"timestamp"},{"name":"input_tokens","title":"输入tokens","type":"int","default":"0"},{"name":"output_tokens","title":"输出tokens","type":"int","default":"0"},{"name":"total_tokens","title":"总tokens","type":"int","default":"0"},{"name":"amount","title":"金额","type":"float","length":18,"dec":4,"default":"0"},{"name":"responsed_seconds","title":"响应时长(秒)","type":"float","length":18,"dec":2,"nullable":true},{"name":"finish_seconds","title":"完成时长(秒)","type":"float","length":18,"dec":2,"nullable":true},{"name":"status","title":"状态","type":"str","length":32,"nullable":true},{"name":"taskid","title":"任务号","type":"str","length":32,"nullable":true}]') - tblfname = [ f['name'] for f in tblfields ] - other_keys = [ k for k in ns.keys() if k in tblfname and k != 'id' ] - if len(other_keys) > 0: - r = await sor.U('llm_metrics', ns) - debug('update success'); - return { - "widgettype":"Message", - "options":{ - "title":"Update Success", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"ok" - } - } - -return { - "widgettype":"Error", - "options":{ - "title":"Update Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"failed" - } -} \ No newline at end of file diff --git a/wwwroot/user_llm_policy/add_user_llm_policy.dspy b/wwwroot/user_llm_policy/add_user_llm_policy.dspy deleted file mode 100644 index 30948b1..0000000 --- a/wwwroot/user_llm_policy/add_user_llm_policy.dspy +++ /dev/null @@ -1,55 +0,0 @@ - -ns = params_kw.copy() -for k,v in ns.items(): - if v == 'NaN' or v == 'null': - ns[k] = None -id = params_kw.id -if not id or len(id) > 32: - id = uuid() -ns['id'] = id - - - -userorgid = await get_userorgid() -if not userorgid: - return { - "widgettype":"Error", - "options":{ - "title":"Authorization Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"Please login" - } - } -ns['orgid'] = userorgid - - -db = DBPools() -dbname = get_module_dbname('llmage') -async with db.sqlorContext(dbname) as sor: - r = await sor.C('user_llm_policy', ns.copy()) - _new_rows = await sor.sqlExe("SELECT * FROM user_llm_policy WHERE id = ${id}$", {'id': id}) - _user_data = _new_rows[0] if _new_rows else ns - return { - "widgettype":"Message", - "options":{ - "cwidth":16, - "cheight":9, - "title":"Add Success", - "timeout":3, - "message":"ok", - "user_data": _user_data - } - } - -return { - "widgettype":"Error", - "options":{ - "title":"Add Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"failed" - } -} \ No newline at end of file diff --git a/wwwroot/user_llm_policy/delete_user_llm_policy.dspy b/wwwroot/user_llm_policy/delete_user_llm_policy.dspy deleted file mode 100644 index 936cc61..0000000 --- a/wwwroot/user_llm_policy/delete_user_llm_policy.dspy +++ /dev/null @@ -1,47 +0,0 @@ - -ns = { - 'id':params_kw['id'], -} - - -userorgid = await get_userorgid() -if not userorgid: - return { - "widgettype":"Error", - "options":{ - "title":"Authorization Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"Please login" - } - } -ns['orgid'] = userorgid - -db = DBPools() -dbname = get_module_dbname('llmage') -async with db.sqlorContext(dbname) as sor: - r = await sor.D('user_llm_policy', ns) - debug('delete success'); - return { - "widgettype":"Message", - "options":{ - "title":"Delete Success", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"ok" - } - } - -debug('Delete failed'); -return { - "widgettype":"Error", - "options":{ - "title":"Delete Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"failed" - } -} \ No newline at end of file diff --git a/wwwroot/user_llm_policy/get_user_llm_policy.dspy b/wwwroot/user_llm_policy/get_user_llm_policy.dspy deleted file mode 100644 index 9eaf90e..0000000 --- a/wwwroot/user_llm_policy/get_user_llm_policy.dspy +++ /dev/null @@ -1,76 +0,0 @@ - -ns = params_kw.copy() - - -userorgid = await get_userorgid() -if not userorgid: - return { - "widgettype":"Error", - "options":{ - "title":"Authorization Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"Please login" - } - } -ns['orgid'] = userorgid -ns['userorgid'] = userorgid - -debug(f'get_user_llm_policy.dspy:{ns=}') -if not ns.get('page'): - ns['page'] = 1 -if not ns.get('sort'): - - - ns['sort'] = 'userid' - - - -sql = '''select a.*, b.userid_text, c.llmid_text, d.orgid_text -from (select * from user_llm_policy where 1=1 [[filterstr]]) a left join (select id as userid, - username as userid_text from users where 1 = 1) b on a.userid = b.userid left join (select id as llmid, - model as llmid_text from llm where 1 = 1) c on a.llmid = c.llmid left join (select id as orgid, - orgname as orgid_text from organization where 1 = 1) d on a.orgid = d.orgid''' - - -filterjson = json.loads('{"AND":[{"field":"orgid","op":"=","var":"orgid"}]}') - - -# 确保 logined 过滤条件始终生效 -if filterjson: - if not isinstance(filterjson, dict) or 'AND' not in filterjson: - filterjson = {'AND': [filterjson] if filterjson else []} - - filterjson['AND'].append({'field': 'orgid', 'op': '=', 'var': '__logined_orgid__'}) - ns['__logined_orgid__'] = userorgid - - - -filterdic = ns.copy() -filterdic['filterstr'] = '' -filterdic['userorgid'] = '${userorgid}$' -filterdic['userid'] = '${userid}$' -if filterjson: - dbf = DBFilter(filterjson) - conds = dbf.gen(ns) - if conds: - ns.update(dbf.consts) - conds = f' and {conds}' - filterdic['filterstr'] = conds -ac = ArgsConvert('[[', ']]') -vars = ac.findAllVariables(sql) -NameSpace = {v:'${' + v + '}$' for v in vars if v != 'filterstr' } -filterdic.update(NameSpace) -sql = ac.convert(sql, filterdic) - -debug(f'{sql=}') -db = DBPools() -dbname = get_module_dbname('llmage') -async with db.sqlorContext(dbname) as sor: - r = await sor.sqlPaging(sql, ns) - return r -return { - "total":0, - "rows":[] -} \ No newline at end of file diff --git a/wwwroot/user_llm_policy/index.ui b/wwwroot/user_llm_policy/index.ui deleted file mode 100644 index 950faaf..0000000 --- a/wwwroot/user_llm_policy/index.ui +++ /dev/null @@ -1,292 +0,0 @@ - -{ - "widgettype":"VBox", - "options":{"height":"100%","width":"100%"}, - "subwidgets":[ -{ - "id":"user_llm_policy_tbl", - "widgettype":"Tabular", - "options":{ - "width":"100%", - "height":"100%", - - - "title":"用户模型策略", - - - - - "toolbar":{ - "tools": [ - { - "name": "filter", - "label": "搜索" - } - ] -}, - - "css":"card", - - - "editable":{ - - "new_data_url":"{{entire_url('add_user_llm_policy.dspy')}}", - - - "delete_data_url":"{{entire_url('delete_user_llm_policy.dspy')}}", - - - "update_data_url":"{{entire_url('update_user_llm_policy.dspy')}}" - - - }, - - - "data_url":"{{entire_url('./get_user_llm_policy.dspy')}}", - - "data_method":"GET", - "data_params":{{json.dumps(params_kw, indent=4, ensure_ascii=False)}}, - "row_options":{ - - - - "browserfields": { - "exclouded": [ - "id", - "orgid", - "created_at", - "updated_at" - ], - "cwidth": {}, - "alters": null -}, - - - "editexclouded":[ - "id", - "orgid", - "created_at", - "updated_at", - "created_by" -], - - "fields":[ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "id" - }, - { - "name": "orgid", - "title": "所属机构", - "type": "str", - "length": 32, - "label": "所属机构", - "uitype": "code", - "valueField": "orgid", - "textField": "orgid_text", - "params": { - "dbname": "{{get_module_dbname('llmage')}}", - "table": "organization", - "tblvalue": "id", - "tbltext": "orgname", - "valueField": "orgid", - "textField": "orgid_text" - }, - "dataurl": "{{entire_url('/appbase/get_code.dspy')}}" - }, - { - "name": "userid", - "title": "用户", - "type": "str", - "length": 32, - "label": "用户", - "uitype": "code", - "valueField": "userid", - "textField": "userid_text", - "params": { - "dbname": "{{get_module_dbname('llmage')}}", - "table": "users", - "tblvalue": "id", - "tbltext": "username", - "valueField": "userid", - "textField": "userid_text" - }, - "dataurl": "{{entire_url('/appbase/get_code.dspy')}}" - }, - { - "name": "llmid", - "title": "模型", - "type": "str", - "length": 32, - "nullable": true, - "label": "模型", - "uitype": "code", - "valueField": "llmid", - "textField": "llmid_text", - "params": { - "dbname": "{{get_module_dbname('llmage')}}", - "table": "llm", - "tblvalue": "id", - "tbltext": "model", - "valueField": "llmid", - "textField": "llmid_text" - }, - "dataurl": "{{entire_url('/appbase/get_code.dspy')}}" - }, - { - "name": "daily_call_limit", - "title": "日调用上限", - "type": "int", - "nullable": true, - "length": 0, - "uitype": "int", - "datatype": "int", - "label": "日调用上限" - }, - { - "name": "monthly_call_limit", - "title": "月调用上限", - "type": "int", - "nullable": true, - "length": 0, - "uitype": "int", - "datatype": "int", - "label": "月调用上限" - }, - { - "name": "spending_alert", - "title": "花费预警", - "type": "float", - "length": 18, - "dec": 2, - "nullable": true, - "cwidth": 18, - "uitype": "float", - "datatype": "float", - "label": "花费预警" - }, - { - "name": "spending_ceiling", - "title": "费用上限", - "type": "float", - "length": 18, - "dec": 2, - "nullable": true, - "cwidth": 18, - "uitype": "float", - "datatype": "float", - "label": "费用上限" - }, - { - "name": "max_concurrency", - "title": "并发上限", - "type": "int", - "nullable": true, - "length": 0, - "uitype": "int", - "datatype": "int", - "label": "并发上限" - }, - { - "name": "status", - "title": "状态", - "type": "str", - "length": 10, - "default": "active", - "cwidth": 10, - "uitype": "str", - "datatype": "str", - "label": "状态" - }, - { - "name": "created_at", - "title": "创建时间", - "type": "timestamp", - "nullable": true, - "length": 0, - "uitype": "str", - "datatype": "timestamp", - "label": "创建时间" - }, - { - "name": "updated_at", - "title": "更新时间", - "type": "timestamp", - "nullable": true, - "length": 0, - "uitype": "str", - "datatype": "timestamp", - "label": "更新时间" - }, - { - "name": "created_by", - "title": "创建人", - "type": "str", - "length": 32, - "nullable": true, - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "创建人" - }, - { - "name": "remark", - "title": "备注", - "type": "str", - "length": 500, - "nullable": true, - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "备注" - } -] - }, - - - - "search_form":{ - "css":"card", - "padding":"8px", - "show_label":false, - "submit_label":"搜索", - "submit_css":"primary", - "fields":[ - { - "name": "orgid", - "uitype": "code", - "placeholder": "所属机构", - "cwidth": 15, - "valueField": "orgid", - "textField": "orgid_text", - "params": { - "dbname": "{{get_module_dbname('llmage')}}", - "table": "organization", - "tblvalue": "id", - "tbltext": "orgname", - "valueField": "orgid", - "textField": "orgid_text" - }, - "dataurl": "{{entire_url('/appbase/get_code.dspy')}}?prepend_all=1" - } -] - }, - - - - - - "page_rows":160, - "cache_limit":5 - } - - ,"binds":[] - -}] -} \ No newline at end of file diff --git a/wwwroot/user_llm_policy/update_user_llm_policy.dspy b/wwwroot/user_llm_policy/update_user_llm_policy.dspy deleted file mode 100644 index 8dc9eab..0000000 --- a/wwwroot/user_llm_policy/update_user_llm_policy.dspy +++ /dev/null @@ -1,78 +0,0 @@ - -ns = params_kw.copy() -for k,v in list(ns.items()): - if v == 'NaN' or v == 'null' or v == '' or v is None: - if k != 'id': - del ns[k] - else: - ns[k] = None if v in ('NaN', 'null') else v - - -userorgid = await get_userorgid() -if not userorgid: - return { - "widgettype":"Error", - "options":{ - "title":"Authorization Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"Please login" - } - } -ns['orgid'] = userorgid - - - - -db = DBPools() -dbname = get_module_dbname('llmage') -async with db.sqlorContext(dbname) as sor: - - ns1 = { - - "orgid": userorgid, - - - "id": params_kw.id - } - recs = await sor.R('user_llm_policy', ns1) - if len(recs) < 1: - return { - "widgettype":"Error", - "options":{ - "title":"Update Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"Record no exist or with wrong ownership" - } - } - - tblfields = json.loads('[{"name":"id","title":"id","type":"str","length":32},{"name":"orgid","title":"所属机构","type":"str","length":32},{"name":"userid","title":"用户","type":"str","length":32},{"name":"llmid","title":"模型","type":"str","length":32,"nullable":true},{"name":"daily_call_limit","title":"日调用上限","type":"int","nullable":true},{"name":"monthly_call_limit","title":"月调用上限","type":"int","nullable":true},{"name":"spending_alert","title":"花费预警","type":"float","length":18,"dec":2,"nullable":true},{"name":"spending_ceiling","title":"费用上限","type":"float","length":18,"dec":2,"nullable":true},{"name":"max_concurrency","title":"并发上限","type":"int","nullable":true},{"name":"status","title":"状态","type":"str","length":10,"default":"active"},{"name":"created_at","title":"创建时间","type":"timestamp","nullable":true},{"name":"updated_at","title":"更新时间","type":"timestamp","nullable":true},{"name":"created_by","title":"创建人","type":"str","length":32,"nullable":true},{"name":"remark","title":"备注","type":"str","length":500,"nullable":true}]') - tblfname = [ f['name'] for f in tblfields ] - other_keys = [ k for k in ns.keys() if k in tblfname and k != 'id' ] - if len(other_keys) > 0: - r = await sor.U('user_llm_policy', ns) - debug('update success'); - return { - "widgettype":"Message", - "options":{ - "title":"Update Success", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"ok" - } - } - -return { - "widgettype":"Error", - "options":{ - "title":"Update Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"failed" - } -} \ No newline at end of file