Files
assist/src/web/blueprints/__pycache__/monitoring.cpython-311.pyc

160 lines
24 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<00>3<EFBFBD>h<EFBFBD>L<00><00><00>dZddlmZmZddlmZmZmZddlmZddl m
Z
ddl m Z ddl mZmZmZmZmZeded <09>
<EFBFBD><00>Zd <0B>Zd <0C>Zd <0A>Ze<14>d<0E><00>d<0F><00><00>Ze<14>d<10><00>d<11><00><00>Ze<14>d<12><00>d<13><00><00>Ze<14>ddg<01><16><00>d<17><00><00>Ze<14>d<18><00>d<19><00><00>Ze<14>d<1A><00>d<1B><00><00>Ze<14>d<1C><00>d<1D><00><00>Ze<14>d<1E><00>d<1F><00><00>Z e<14>d <20><00>d!<21><00><00>Z!e<14>d d"g<01><16><00>d#<23><00><00>Z"d$S)%u3
监控管理蓝图
处理监控相关的API路由
<EFBFBD><00><02>datetime<6D> timedelta)<03> Blueprint<6E>request<73>jsonify)<01>func)<01> TSPAssistant)<01>
db_manager)<05> Conversation<6F> WorkOrder<65>Alert<72>KnowledgeEntry<72> VehicleData<74>
monitoringz/api)<01>
url_prefixc<00><><00>|sdStd<02>|D<00><00><00><00>}t|<00><00>|z
}t|dz |dz z<00><00>S)u估算文本的Token数量rc<00>2<00>g|]}d|cxkrdk<00>nn|<01><02>S)u一u鿿<>)<02>.0<EFBFBD>cs <20>6D:\code\tsp-assistant\src\web\blueprints\monitoring.py<70>
<listcomp>z#estimate_tokens.<locals>.<listcomp>s9<00><00>F<>F<>F<>q<EFBFBD>H<EFBFBD><01>,E<>,E<>,E<>,E<>X<EFBFBD>,E<>,E<>,E<>,E<>,E<><11>,E<>,E<>,E<><00><00>?<3F>)<02>len<65>int)<03>text<78> chinese_chars<72> english_charss r<00>estimate_tokensr"sZ<00><00> <0F><11><10>q<EFBFBD><18>F<>F<>D<EFBFBD>F<>F<>F<>G<>G<>M<EFBFBD><17><04>I<EFBFBD>I<EFBFBD> <0A>-<2D>M<EFBFBD> <0E>}<7D>s<EFBFBD>"<22>]<5D>Q<EFBFBD>%6<>6<> 7<> 7<>7rc<00>|<00>d}|D]6}|jpd}|jpd}|t|<03><00>t|<04><00>zz }<01>7|S)u#计算对话记录的Token使用量r<00>)<03> user_message<67>assistant_responser")<05> conversations<6E> total_tokens<6E>convr%r&s r<00>calculate_conversation_tokensr*s[<00><00><14>L<EFBFBD><1D>\<01>\<01><04><1B>(<28>.<2E>B<EFBFBD> <0C>!<21>4<>:<3A><02><1A><14><0F> <0C>5<>5<><0F>HZ<48>8[<5B>8[<5B>[<5B>[<5B> <0C> <0C> <17>rc<00>L<00>dt<00><00>vrt<00><00>atS)u$获取TSP助手实例懒加载<E8BDBD>
_assistant)<03>globalsr
r,rrr<00> get_assistantr.#s"<00><00><14>7<EFBFBD>9<EFBFBD>9<EFBFBD>$<24>$<24>!<21>^<5E>^<5E>
<EFBFBD> <15>rz/token-monitor/statsc
<00><><00><0E> ddlm}m}ddl}|j<00><00>}|<03>dddd<01><04><00><00>|<03>ddddd<01><06><00>}t j<00><00>5}|<05>t<00><00><00> tj
|k<00><00><00> <00><00>}<06>fd<07>|D<00><00>}|}t|<07><00>} t|<08><00>}
|
dzd z } d } td
| |
t| d <0B><00>| d <0C><05><00>cddd<03><00>S#1swxYwYdS#t$r*} td t!| <0A><00>i<01><00>dfcYd} ~ Sd} ~ wwxYw)u获取Token监控统计rrN)<04>hour<75>minute<74>second<6E> microsecond<6E>)<05>dayr0r1r2r3c<00>*<00><01>g|]}|j<00>k<00> |<01><02>Sr)<01> timestamp)rr<00> today_starts <20>rrz+get_token_monitor_stats.<locals>.<listcomp>=s&<00><><00>"`<60>"`<60>"`<60><11>Q<EFBFBD>[<5B>T_<54>E_<45>E_<45>1<EFBFBD>E_<45>E_<45>E_r<00>-C<1C><>6J?<3F><>T<>)<05>success<73> today_tokens<6E> month_tokens<6E>
total_cost<EFBFBD> budget_limit<69>error<6F><72>)rr<00>calendar<61>now<6F>replacer <00> get_session<6F>queryr <00>filterr7<00>allr*r<00>round<6E> Exception<6F>str)rrrCrD<00> month_start<72>session<6F>conversations_query<72>today_conversations<6E>month_conversationsr=r>r?r@<00>er8s @r<00>get_token_monitor_statsrS+s<><00><><00>"/<2F>0<>0<>0<>0<>0<>0<>0<>0<><17><0F><0F><0F><1A>h<EFBFBD>l<EFBFBD>n<EFBFBD>n<EFBFBD><03><19>k<EFBFBD>k<EFBFBD>q<EFBFBD><11>1<EFBFBD>!<21>k<EFBFBD>L<>L<> <0B><19>k<EFBFBD>k<EFBFBD>a<EFBFBD>a<EFBFBD><01>!<21>QR<51>k<EFBFBD>S<>S<> <0B> <17> #<23> %<25> %<25> <0F><17>")<29>-<2D>-<2D> <0C>"=<3D>"=<3D>"D<>"D<><1C>&<26>+<2B>5<>#<0E>#<0E><11>c<EFBFBD>e<EFBFBD>e<EFBFBD> <20>
#a<01>"`<60>"`<60>"`<60>.A<>"`<60>"`<60>"`<60> <1F>"5<> <1F>9<>9L<39>M<>M<>L<EFBFBD>8<>9L<39>M<>M<>L<EFBFBD>&<26><06>.<2E><14>5<>J<EFBFBD><1F>L<EFBFBD><1A><1F> ,<2C> ,<2C>#<23>J<EFBFBD><01>2<>2<> ,<2C> <0E><0E><0F><0F>% <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F><><EFBFBD><EFBFBD> <0F> <0F> <0F> <0F> <0F> <0F><>2 <15>/<2F>/<2F>/<2F><16><07><13>Q<EFBFBD><16><16>(<28>)<29>)<29>3<EFBFBD>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>sC<00>A!D&<00>$B(D<03> D&<00>D<07>D&<00> D<07>!D&<00>&
E<03>0E<03>E<03>Ez/token-monitor/chartc<00><00> tj<00>dd<02><00>}ddlm}m}|j<00><00>}g}g}g}|dk<00>r(t d<06><00>D<00>]}|||dz<00><08><00>z
}|||<07><08><00>z
} |<04>d|<08>d <09><00><00><00>tj
<00><00>5}
|
<EFBFBD> t<00><00><00> tj|ktj| k<00><00><00><00><00>} t!| <0B><00>} |<05>d| <0C><00>|<06>d| d
zd z <00><00>d d d <0C><00>n #1swxYwY<00><01><17>nP|dk<00>r(t d <0A><00>D<00>]}|||dz<00><0E><00>z
} |||<07><0E><00>z
}|<04>d| <0A>d<0F><00><00><00>tj
<00><00>5}
|
<EFBFBD> t<00><00><00> tj| ktj|k<00><00><00><00><00>}t!|<0F><00>}|<05>d|<10><00>|<06>d|d
zd z <00><00>d d d <0C><00>n #1swxYwY<00><01><17>n!|dk<00>rt d<11><00>D<00>] }|||dz<00><12><00>z
}|||<07><12><00>z
}|<04>dd|dz<00>d<14><03><00>tj
<00><00>5}
|
<EFBFBD> t<00><00><00> tj|ktj|k<00><00><00><00><00>}t!|<13><00>}|<05>d|<14><00>|<06>d|d
zd z <00><00>d d d <0C><00>n #1swxYwY<00><01> t#d|||d<16><04><00>S#t$$r*}t#dt'|<15><00>i<01><00>dfcYd }~Sd }~wwxYw)u#获取Token使用趋势图表数据<E695B0>periodr5rrr0<00>r4)<01>hoursz%H:00r9r:N<>)<01>daysz%m-%d<>weekr)<01>weeksu第u周T)r<<00>labels<6C>tokens<6E>costsrArB)r<00>args<67>getrrrD<00>range<67>insert<72>strftimer rFrGr rHr7rIr*rrKrL)rUrrrDr\r]r^<00>i<>
hour_start<EFBFBD>hour_endrN<00>hour_conversations<6E> hour_tokens<6E> day_start<72>day_end<6E>day_conversations<6E>
day_tokens<EFBFBD>
week_start<EFBFBD>week_end<6E>week_conversations<6E> week_tokensrRs r<00>get_token_monitor_chartrqRs&<00><00>I/<2F><18><1C>!<21>!<21>(<28>E<EFBFBD>2<>2<><06>0<>0<>0<>0<>0<>0<>0<>0<><1A>h<EFBFBD>l<EFBFBD>n<EFBFBD>n<EFBFBD><03><13><06><13><06><12><05> <11>V<EFBFBD> <1B> <1B><1A>2<EFBFBD>Y<EFBFBD>Y<EFBFBD> A<01> A<01><01> <20>9<EFBFBD>9<EFBFBD>1<EFBFBD>Q<EFBFBD>3<EFBFBD>#7<>#7<>#7<>7<>
<EFBFBD><1E><19><19><11>!3<>!3<>!3<>3<><08><16> <0A> <0A>a<EFBFBD><1A>!4<>!4<>W<EFBFBD>!=<3D>!=<3D>><3E>><3E>><3E><1F>+<2B>-<2D>-<2D>
A<01><17>)0<><1D><1D>|<7C>)D<>)D<>)K<>)K<>$<24>.<2E>*<2A><<3C>$<24>.<2E><18>9<>*<16>*<16><1A>c<EFBFBD>e<EFBFBD>e<EFBFBD>'<27> #@<01>@R<>"S<>"S<>K<EFBFBD><1A>M<EFBFBD>M<EFBFBD>!<21>[<5B>1<>1<>1<><19>L<EFBFBD>L<EFBFBD><11>K<EFBFBD>&<26>$8<>4<EFBFBD>$?<3F>@<40>@<40>@<40>
A<01>
A<01>
A<01>
A<01>
A<01>
A<01>
A<01>
A<01>
A<01>
A<01>
A<01><><EFBFBD><EFBFBD>
A<01>
A<01>
A<01>
A<01><>  A<01>"<14>u<EFBFBD>_<EFBFBD>_<EFBFBD><1A>1<EFBFBD>X<EFBFBD>X<EFBFBD> @<01> @<01><01><1F>)<29>)<29><11>1<EFBFBD><13>"5<>"5<>"5<>5<> <09><1D> <09> <09>q<EFBFBD> 1<> 1<> 1<>1<><07><16> <0A> <0A>a<EFBFBD><19>!3<>!3<>G<EFBFBD>!<<3C>!<<3C>=<3D>=<3D>=<3D><1F>+<2B>-<2D>-<2D>
@<01><17>(/<2F> <0A> <0A>l<EFBFBD>(C<>(C<>(J<>(J<>$<24>.<2E>)<29>;<3B>$<24>.<2E><17>8<>)<16>)<16><1A>c<EFBFBD>e<EFBFBD>e<EFBFBD>&<26> "?<3F>?P<>!Q<>!Q<>J<EFBFBD><1A>M<EFBFBD>M<EFBFBD>!<21>Z<EFBFBD>0<>0<>0<><19>L<EFBFBD>L<EFBFBD><11>J<EFBFBD><16>$7<>$<24>$><3E>?<3F>?<3F>?<3F>
@<01>
@<01>
@<01>
@<01>
@<01>
@<01>
@<01>
@<01>
@<01>
@<01>
@<01><><EFBFBD><EFBFBD>
@<01>
@<01>
@<01>
@<01><>  @<01>"<14>v<EFBFBD> <1D> <1D><1A>1<EFBFBD>X<EFBFBD>X<EFBFBD> A<01> A<01><01> <20>9<EFBFBD>9<EFBFBD>1<EFBFBD>Q<EFBFBD>3<EFBFBD>#7<>#7<>#7<>7<>
<EFBFBD><1E><19><19><11>!3<>!3<>!3<>3<><08><16> <0A> <0A>a<EFBFBD><1E>q<EFBFBD><11>s<EFBFBD><1E><1E><1E>0<>0<>0<><1F>+<2B>-<2D>-<2D>
A<01><17>)0<><1D><1D>|<7C>)D<>)D<>)K<>)K<>$<24>.<2E>*<2A><<3C>$<24>.<2E><18>9<>*<16>*<16><1A>c<EFBFBD>e<EFBFBD>e<EFBFBD>'<27> #@<01>@R<>"S<>"S<>K<EFBFBD><1A>M<EFBFBD>M<EFBFBD>!<21>[<5B>1<>1<>1<><19>L<EFBFBD>L<EFBFBD><11>K<EFBFBD>&<26>$8<>4<EFBFBD>$?<3F>@<40>@<40>@<40>
A<01>
A<01>
A<01>
A<01>
A<01>
A<01>
A<01>
A<01>
A<01>
A<01>
A<01><><EFBFBD><EFBFBD>
A<01>
A<01>
A<01>
A<01><><17><1B><1C><1C><1A> 
<EFBFBD>
<EFBFBD> <0B> <0B> <0B><> <15>/<2F>/<2F>/<2F><16><07><13>Q<EFBFBD><16><16>(<28>)<29>)<29>3<EFBFBD>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>s<EFBFBD><00>B3O<00>5BE<05> O<00>E# <09>#O<00>&E# <09>'A=O<00>$BJ<05> O<00>J <09>O<00>J <09>A1O<00>BN1<05>% O<00>1N5 <09>5O<00>8N5 <09>9O<00>
P<03>P<03>;P<03>Pz/token-monitor/recordsc<00>d<00> tj<00>ddt<00><03><00>}t j<00><00>5}|<01>t<00><00><00>tj <00>
<00><00><00><00><00> |<00><00><00> <00><00>}g}|D]<5D>}|j pd}|jpd}t|<05><00>}t|<06><00>}||z} |dz|dzzdz }
|<03>|j r|j <00><00><00>ndd |j<00><00>d
||| t'|
d <0B><00>|jpd d <0A><08><00><00><>t+d|d<0F><02><00>cddd<08><00>S#1swxYwYdS#t,$r*} t+dt/| <0B><00>i<01><00>dfcYd} ~ Sd} ~ wwxYw)u获取Token使用详细记录<E8AEB0>limit<69>2)<01>typer$r9g<><67><EFBFBD><EFBFBD>Mb`?r:N<>user_<72>
qwen-turbo<62>r)r7<00>user_id<69>model<65> input_tokens<6E> output_tokensr(<00>cost<73> response_timeT)r<<00>recordsrArB)rr_r`rr rFrGr <00>order_byr7<00>descrsrIr%r&r"<00>append<6E> isoformat<61>idrJr~rrKrL) rsrNr'rr)r%r&r{r|r(r}rRs r<00>get_token_monitor_recordsr<73><00>s-<00><00>%/<2F><17> <0C> <20> <20><17>"<22>3<EFBFBD> <20>7<>7<><05> <17> #<23> %<25> %<25> <0F><17>#<23>M<EFBFBD>M<EFBFBD>,<2C>7<>7<>@<40>@<40><1C>&<26>+<2B>+<2B>-<2D>-<2D><0E><0E><13>e<EFBFBD>E<EFBFBD>l<EFBFBD>l<EFBFBD>3<EFBFBD>3<EFBFBD>5<EFBFBD>5<EFBFBD> <1A><19>G<EFBFBD>%<25> <13> <13><04>#<23>0<>6<>B<EFBFBD> <0C>%)<29>%<<3C>%B<><02>"<22>.<2E>|<7C><<3C><<3C> <0C> /<2F>0B<30> C<> C<> <0A>+<2B>m<EFBFBD>;<3B> <0C>%<25>v<EFBFBD>-<2D> <0A><05>0E<30>E<><14>M<><04><17><0E><0E>?C<>~<7E>!W<><14><1E>!9<>!9<>!;<3B>!;<3B>!;<3B>SW<53>0<>t<EFBFBD>w<EFBFBD>0<>0<>)<29>$0<>%2<>$0<>!<21>$<24><01>N<EFBFBD>N<EFBFBD>%)<29>%7<>%<<3C>1<EFBFBD> <12> <12> <13> <13> <13> <13><1B><1F>"<22><0E><0E><0F><0F>; <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F><><EFBFBD><EFBFBD> <0F> <0F> <0F> <0F> <0F> <0F><>B <15>/<2F>/<2F>/<2F><16><07><13>Q<EFBFBD><16><16>(<28>)<29>)<29>3<EFBFBD>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>sA<00>:E;<00>D%E.<03>! E;<00>.E2<07>2E;<00>5E2<07>6E;<00>;
F/<03>F*<03>$F/<03>*F/z/token-monitor/settings<67>POST)<01>methodsc<00><><00> tj<00><00>}tddd<03><02><00>S#t$r*}tdt |<01><00>i<01><00>dfcYd}~Sd}~wwxYw)u保存Token监控设置TuToken设置已保存<E4BF9D>r<<00>messagerArBN)r<00>get_jsonrrKrL)<02>datarRs r<00>save_token_monitor_settingsr<73><00>s<><00><00> /<2F><16><1F>!<21>!<21><04>
<17><1B>-<2D>
<EFBFBD>
<EFBFBD> <0B> <0B> <0B><> <15>/<2F>/<2F>/<2F><16><07><13>Q<EFBFBD><16><16>(<28>)<29>)<29>3<EFBFBD>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>s<00>$'<00>
A<03>A<03>A<03>Az/token-monitor/exportc<00><><00> ddlm}ddlm}|<00><00>}|j}d|_d|d<|dd<08> <09><00>|d_gd
<EFBFBD>}t|d <0B><00>D]\}}|<03>d ||<06> <0A><00><00>tj
<00><00>5}|<07> t<00><00><00> tj<00><00><00><00><00><00>d<0E><00><00><00><00>}t|d<0F><00>D<00>]\} }
|<03>| d |
jr|
j<00><00><00>nd<10> <0A><00>|<03>| d|
jpd<10> <0A><00>|<03>| d d<12> <0A><00>|<03>| d|
jpd<01> <0A><00>|<03>| d|
jpddz<00> <0A><00>|<03>| d|
jpddz<00> <0A><00>|<03>| d|
jpddz<00> <0A><00>|<03>| d|
jpd<01> <0A><00><00><01> ddd<1A><00>n #1swxYwYddl} ddl} | j<00>| <0B><00><00>d<1B><00>} |<02>| <0A><00>ddlm}|| dd<1B><1D><00>S#t:$r*}t=dt?|<0F><00>i<01><00>dfcYd}~Sd}~wwxYw) u导出Token使用数据r)<01>Workbook)<01>FontuToken使用数据uToken使用数据导出<E5AFBC>A1<41>T)<02>size<7A>bold)u时间u用户u模型u 输入Tokenu 输出Tokenu总Tokenu成本u 响应时间r4<00>)<03>row<6F>column<6D>valuer:rr$r;rw<00>g<00>?rxrrXg-C<1C><>6?<3F>Nztoken_usage_data.xlsx)<01> send_file)<02> as_attachment<6E> download_namerArB) <20>openpyxlr<6C><00>openpyxl.stylesr<73><00>active<76>title<6C>font<6E> enumerate<74>cellr rFrGr r<>r7r<>rsrIr<>ryr~<00>tempfile<6C>os<6F>path<74>join<69>
gettempdir<EFBFBD>save<76>flaskr<6B>rKrrL)r<>r<><00>wb<77>ws<77>headers<72>col<6F>headerrNr'r<>r)r<>r<><00> temp_pathr<68>rRs r<00>export_token_monitor_datar<61><00>sl<00><00>+/<2F>%<25>%<25>%<25>%<25>%<25>%<25>(<28>(<28>(<28>(<28>(<28>(<28> <15>X<EFBFBD>Z<EFBFBD>Z<EFBFBD><02> <0F>Y<EFBFBD><02>&<26><02><08>-<2D><02>4<EFBFBD><08><1C><04>"<22>4<EFBFBD>0<>0<>0<><02>4<EFBFBD><08> <0A>u<01>t<>t<><07>$<24>W<EFBFBD>a<EFBFBD>0<>0<> 5<> 5<>K<EFBFBD>C<EFBFBD><16> <0E>G<EFBFBD>G<EFBFBD><01>#<23>V<EFBFBD>G<EFBFBD> 4<> 4<> 4<> 4<><18> #<23> %<25> %<25> J<01><17>#<23>M<EFBFBD>M<EFBFBD>,<2C>7<>7<>@<40>@<40><1C>&<26>+<2B>+<2B>-<2D>-<2D><0E><0E><13>e<EFBFBD>D<EFBFBD>k<EFBFBD>k<EFBFBD>#<23>#<23>%<25>%<25> <1A>'<27>}<7D>a<EFBFBD>8<>8<> J<01> J<01> <09><03>T<EFBFBD><12><07><07>C<EFBFBD><01>t<EFBFBD>~<7E>1e<31><14><1E>1I<31>1I<31>1K<31>1K<31>1K<31>ce<63><07>f<>f<>f<><12><07><07>C<EFBFBD><01><14><1C>1C<31><12><07>D<>D<>D<><12><07><07>C<EFBFBD><01><1C><07>><3E>><3E>><3E><12><07><07>C<EFBFBD><01><14>1C<31>1H<31>q<EFBFBD><07>I<>I<>I<><12><07><07>C<EFBFBD><01>$<24>2D<32>2I<32><01>S<EFBFBD>1P<31><07>Q<>Q<>Q<><12><07><07>C<EFBFBD><01>$<24>2D<32>2I<32><01>S<EFBFBD>1P<31><07>Q<>Q<>Q<><12><07><07>C<EFBFBD><01>$<24>2D<32>2I<32><01>V<EFBFBD>1S<31><07>T<>T<>T<><12><07><07>C<EFBFBD><01><14>1C<31>1H<31>q<EFBFBD><07>I<>I<>I<>I<> J<01> J<01> J<01> J<01> J<01> J<01> J<01> J<01> J<01> J<01> J<01> J<01><><EFBFBD><EFBFBD> J<01> J<01> J<01> J<01> <18><0F><0F><0F><11> <09> <09> <09><16>G<EFBFBD>L<EFBFBD>L<EFBFBD><18>!4<>!4<>!6<>!6<>8O<38>P<>P<> <09>
<EFBFBD><07><07> <09><1A><1A><1A>#<23>#<23>#<23>#<23>#<23>#<23><18>y<EFBFBD><19>$<24>F]<5D>^<5E>^<5E>^<5E>^<5E><> <14>/<2F>/<2F>/<2F><16><07><13>Q<EFBFBD><16><16>(<28>)<29>)<29>3<EFBFBD>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>sD<00>BJ<00>FH/<03># J<00>/H3<07>3J<00>6H3<07>7A J<00>
K <03>"K<03>K <03>K z/ai-monitor/statsc <00><00> tj<00><00>5}|<00>t<00><00><00>tj<00><00><00><00><00><00>d<01><00><00><00><00>}t|<01><00>}|dkr!tdddddd<04><05><00>cddd<05><00>Sd}d}g}|D]<5D>}d}|j r1|<05> |j <00><00>||j z }|j dkrd}|j r |j dkrd}|jr*t|j<00><00><00><00><00>d krd}|r|d
z }<03><>|dkr||z d znd}d |z
} |r|t|<05><00>z nd}
td|t!|d
<EFBFBD><00>t!| d
<EFBFBD><00>t!|
d<02><00>d<04><05><00>cddd<05><00>S#1swxYwYdS#t"$r*} td t%| <0B><00>i<01><00>d fcYd} ~ Sd} ~ wwxYw)u获取AI监控统计r:rT)r<<00> total_calls<6C> success_rate<74>
error_rate<EFBFBD>avg_response_timeN<65>'F<>333333<33>?r<>r4<00>drArB)r rFrGr r<>r7r<>rsrIrrr~r<><00>confidence_scorer&<00>striprJrKrL) rNr'r<><00>successful_calls<6C>total_response_time<6D>response_timesr)<00>
is_successr<EFBFBD>r<>r<>rRs r<00>get_ai_monitor_statsr<73> s<><00><00>8/<2F> <17> #<23> %<25> %<25>5 <0F><17>#<23>M<EFBFBD>M<EFBFBD>,<2C>7<>7<>@<40>@<40><1C>&<26>+<2B>+<2B>-<2D>-<2D><0E><0E><13>e<EFBFBD>D<EFBFBD>k<EFBFBD>k<EFBFBD>#<23>#<23>%<25>%<25> <1A><1E>m<EFBFBD>,<2C>,<2C>K<EFBFBD><1A>a<EFBFBD><1F><1F><1E>#<23>#$<24>$%<25>"#<23>)*<2A>  <12> <12><13><13>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F>" !<21> <1C>"#<23> <1F><1F>N<EFBFBD>%<25> *<2A> *<2A><04>!<21>
<EFBFBD><18>%<25>+<2B>"<22>)<29>)<29>$<24>*<<3C>=<3D>=<3D>=<3D>'<27>4<EFBFBD>+=<3D>=<3D>'<27><1B>)<29>E<EFBFBD>1<>1<>%*<2A>
<EFBFBD><18>(<28>'<27>T<EFBFBD>-B<>S<EFBFBD>-H<>-H<>!&<26>J<EFBFBD><1C>.<2E>'<27>#<23>d<EFBFBD>6M<36>6S<36>6S<36>6U<36>6U<36>2V<32>2V<32>YZ<59>2Z<32>2Z<32>!&<26>J<EFBFBD><1D>*<2A>$<24><01>)<29>$<24><>EP<45>ST<53>_<EFBFBD>_<EFBFBD>,<2C>{<7B>:<3A>S<EFBFBD>@<40>@<40>Z[<5B>L<EFBFBD><1C>|<7C>+<2B>J<EFBFBD>O]<5D> d<>!4<>s<EFBFBD>><3E>7J<37>7J<37>!J<>!J<>cd<63> <1D><1A><1F>*<2A> %<25>l<EFBFBD>A<EFBFBD> 6<> 6<>#<23>J<EFBFBD><01>2<>2<>%*<2A>+<<3C>a<EFBFBD>%@<40>%@<40> <0E><0E><0F><0F>_5 <0F>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F><><EFBFBD><EFBFBD>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F>5 <0F><>l <15>/<2F>/<2F>/<2F><16><07><13>Q<EFBFBD><16><16>(<28>)<29>)<29>3<EFBFBD>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>sN<00>G<00>BG<03>- G<00>:C<G<03>6 G<00>G<07>G<00>
G<07> G<00>
H<03>G?<03>9H<03>?Hz/ai-monitor/model-comparisonc<00><><00> tj<00><00>5}|<00>t<00><00><00><00><00>}i}|D]<5D>}d}||vr
dddgd<03>||<||dxxdz cc<d}|jr |jdkrd}|jr |jd krd}|jr*t|j<00> <00><00><00><00>d
krd}|r||d xxdz cc<|jrA||d <00>
|j<00><00>||d xx|jz cc<<00><>g}g}g}|<02> <00><00>D]<5D>\}} |<06>
|<04><00>| ddkr| d | dz dznd}
|<07>
t|
d<05><00><00><00>| d r| d t| d <00><00>z nd} |<08>
t| d<02><00><00><00><00><>|s dg}dg}dg}td|||d<10><04><00>cddd<11><00>S#1swxYwYdS#t$r*} tdt| <0C><00>i<01><00>dfcYd} ~ Sd} ~ wwxYw)u获取模型性能对比数据rwr)r<>r<>r<>r<>r<>r4Tr<54>Fr<46>r<>r<>r<>r<>r<>gY@)r<<00>models<6C> success_ratesr<73>NrArB)r rFrGr rIr~r<>r&rr<>r<><00>itemsrJrrKrL) rNr'<00> model_statsr)rzr<>r<>r<>r<><00>statsr<73>r<>rRs r<00>get_model_comparisonr<6E>Hsm<00><00>?/<2F> <17> #<23> %<25> %<25>< <0F><17>#<23>M<EFBFBD>M<EFBFBD>,<2C>7<>7<>;<3B>;<3B>=<3D>=<3D>M<EFBFBD><1D>K<EFBFBD>%<25> T<01> T<01><04>$<24><05><18> <0B>+<2B>+<2B>'(<28>,-<2D>/0<>*,<2C> *<16>*<16>K<EFBFBD><05>&<26><1C>E<EFBFBD>"<22>=<3D>1<>1<>1<>Q<EFBFBD>6<>1<>1<>1<>"<22>
<EFBFBD><17>%<25>'<27>$<24>*<<3C>u<EFBFBD>*D<>*D<>!&<26>J<EFBFBD><17>(<28>'<27>T<EFBFBD>-B<>S<EFBFBD>-H<>-H<>!&<26>J<EFBFBD><1B>.<2E>'<27>#<23>d<EFBFBD>6M<36>6S<36>6S<36>6U<36>6U<36>2V<32>2V<32>YZ<59>2Z<32>2Z<32>!&<26>J<EFBFBD><1D>@<01><1F><05>&<26>'9<>:<3A>:<3A>:<3A>a<EFBFBD>?<3F>:<3A>:<3A>:<3A><17>%<25>T<01><1F><05>&<26>'7<>8<>?<3F>?<3F><04>@R<>S<>S<>S<><1F><05>&<26>'<<3C>=<3D>=<3D>=<3D><14>AS<41>S<>=<3D>=<3D>=<3D><><18>F<EFBFBD><1E>M<EFBFBD><1F>N<EFBFBD> +<2B> 1<> 1<> 3<> 3<> C<01> C<01> <0C><05>u<EFBFBD><16> <0A> <0A>e<EFBFBD>$<24>$<24>$<24>[`<60>an<61>[o<>rs<72>[s<>[s<><05>&8<> 9<>E<EFBFBD>-<2D><P<> P<>SV<53> V<> V<>yz<79> <0C><1D>$<24>$<24>U<EFBFBD><<3C><11>%;<3B>%;<3B><<3C><<3C><<3C>ej<65>k{<7B>e|<7C>%D<02>U<EFBFBD>+@<40>%A<>C<EFBFBD><05>N^<5E>H_<48>D`<60>D`<60>%`<60>%`<60>CD<02>!<21><1E>%<25>%<25>e<EFBFBD>,=<3D>q<EFBFBD>&A<>&A<>B<>B<>B<>B<><1A> %<25>&<26><1E><06>!&<26><07> <0A>"#<23><13><0E><1A><1F> <20>!.<2E>"0<> <0E><0E><0F><0F>o< <0F>< <0F>< <0F>< <0F>< <0F>< <0F>< <0F>< <0F>< <0F>< <0F>< <0F>< <0F><><EFBFBD><EFBFBD>< <0F>< <0F>< <0F>< <0F>< <0F>< <0F><>z <15>/<2F>/<2F>/<2F><16><07><13>Q<EFBFBD><16><16>(<28>)<29>)<29>3<EFBFBD>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>sA<00>H)<00>G:H<03> H)<00>H <07> H)<00>#H <07>$H)<00>)
I<03>3I<03>I<03>Iz/ai-monitor/error-distributionc<00><00> tj<00><00>5}|<00>t<00><00><00><00><00>}gd<01>}gd<02>}|D]<5D>}|jr|jdkr|dxxdz cc<<00>%|jr|jdkr|dxxdz cc<<00>H|jr*t|j<00> <00><00><00><00>dkr|dxxdz cc<<00><>|jr;t|j<00> <00><00><00><00>dkr|d xxdz cc<<00><>|d
xxdz cc<<00><>td ||d <0C><03><00>cd d d <0A><00>S#1swxYwYd S#t$r*}tdt|<05><00>i<01><00>dfcYd }~Sd }~wwxYw)u获取错误类型分布)u成功<E68890> 响应超时<E8B685> 内容异常<E5BC82> 格式错误u 其他错误)rrrrrr<>r4r<>r;r<>r<>rrT)r<<00> error_types<65>countsNrArB) r rFrGr rIr~r<>r&rr<>rrKrL)rNr'r<>r<>r)rRs r<00>get_error_distributionr<6E><00>s%<00><00>/<2F> <17> #<23> %<25> %<25> <0F><17>#<23>M<EFBFBD>M<EFBFBD>,<2C>7<>7<>;<3B>;<3B>=<3D>=<3D>M<EFBFBD>e<01>d<>d<>K<EFBFBD>$<24>_<EFBFBD>_<EFBFBD>F<EFBFBD>%<25> #<23> #<23><04><17>%<25> #<23>$<24>*<<3C>u<EFBFBD>*D<>*D<><1A>1<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><11>N<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><19>*<2A>#<23>t<EFBFBD>/D<>s<EFBFBD>/J<>/J<><1A>1<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><11>N<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><1D>0<>#<23>C<EFBFBD><04>8O<38>8U<38>8U<38>8W<38>8W<38>4X<34>4X<34>[\<5C>4\<5C>4\<5C><1A>1<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><11>N<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><19>,<2C>#<23><13>T<EFBFBD>5L<35>5R<35>5R<35>5T<35>5T<35>1U<31>1U<31>YZ<59>1Z<31>1Z<31><1A>1<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><11>N<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><1A>1<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><11>N<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><1A><1F>*<2A> <20><0E><0E><0F><0F>+ <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F> <0F><><EFBFBD><EFBFBD> <0F> <0F> <0F> <0F> <0F> <0F><>4 <15>/<2F>/<2F>/<2F><16><07><13>Q<EFBFBD><16><16>(<28>)<29>)<29>3<EFBFBD>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>sA<00>E<00>D&E<03>; E<00>E <07> E<00>E <07>E<00>
F <03>F<03>>F <03>F z/ai-monitor/error-logc <00><><00> tj<00><00>5}|<00>t<00><00><00>tj<00><00><00><00><00><00>d<01><00><00><00><00>}g}d}|D]<5D>}d}d}|j r|j dkrd}d|j <00>d<07>}n{|j
r|j
dkr d }d
|j
<00><00>}n\|j r*t|j <00> <00><00><00><00>d krd }d }n&|j rd|j <00><00><00>vrd}d}|rI|<02>||jr|j<00><00><00>nd||dd|j<00><00>d<13><06><00>|dz }<03><>t%d|d<15><02><00>cddd<03><00>S#1swxYwYdS#t&$r*}t%dt)|<07><00>i<01><00>dfcYd}~Sd}~wwxYw)u获取错误日志rtr4Nr<4E>r<>u响应时间过长: <20>msr<73>r<>u置信度过低: r<>r<>u!助手回复内容过短或为空rAu API错误u回复中包含错误信息rwrv)r<>r7<00>
error_type<EFBFBD> error_messagerzryT)r<<00>errorsrB)r rFrGr r<>r7r<>rsrIr~r<>r&rr<><00>lowerr<72>r<>r<>rrKrL)rNr'r<><00>error_idr)r<>r<>rRs r<00> get_error_logr<67><00>s<><00><00>-/<2F> <17> #<23> %<25> %<25>* <0F><17>#<23>M<EFBFBD>M<EFBFBD>,<2C>7<>7<>@<40>@<40><1C>&<26>+<2B>+<2B>-<2D>-<2D><0E><0E><13>e<EFBFBD>B<EFBFBD>i<EFBFBD>i<EFBFBD><03><03><05><05> <1A><18>F<EFBFBD><18>H<EFBFBD>%<25> "<22> "<22><04>!<21>
<EFBFBD> $<24> <0A><18>%<25> B<01>$<24>*<<3C>u<EFBFBD>*D<>*D<>!/<2F>J<EFBFBD>$Q<>4<EFBFBD>;M<>$Q<>$Q<>$Q<>M<EFBFBD>M<EFBFBD><19>*<2A>B<01>t<EFBFBD>/D<>s<EFBFBD>/J<>/J<>!/<2F>J<EFBFBD>$O<><04>8M<38>$O<>$O<>M<EFBFBD>M<EFBFBD><1D>0<>B<01>C<EFBFBD><04>8O<38>8U<38>8U<38>8W<38>8W<38>4X<34>4X<34>[\<5C>4\<5C>4\<5C>!/<2F>J<EFBFBD>$G<>M<EFBFBD>M<EFBFBD><19>,<2C>B<01><17>D<EFBFBD><S<><Y<><Y<><[<5B><[<5B>1[<5B>1[<5B>!,<2C>J<EFBFBD>$A<>M<EFBFBD><1E> "<22><1A>M<EFBFBD>M<EFBFBD>&<26>CG<43>><3E>%[<5B>T<EFBFBD>^<5E>%=<3D>%=<3D>%?<3F>%?<3F>%?<3F>W[<5B>&0<>)6<>!-<2D>#4<>4<EFBFBD>7<EFBFBD>#4<>#4<> #<16>#<16><17><17><17><1D><01>M<EFBFBD>H<EFBFBD><48><1A><1F> <20><0E><0E><0F><0F>O* <0F>* <0F>* <0F>* <0F>* <0F>* <0F>* <0F>* <0F>* <0F>* <0F>* <0F>* <0F><><EFBFBD><EFBFBD>* <0F>* <0F>* <0F>* <0F>* <0F>* <0F><>V <15>/<2F>/<2F>/<2F><16><07><13>Q<EFBFBD><16><16>(<28>)<29>)<29>3<EFBFBD>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>sA<00>F"<00>E3F<03> F"<00>F<07>F"<00>F<07>F"<00>"
G<03>,G<03> G<03>G<03>DELETEc<00><><00> tddd<03><02><00>S#t$r*}tdt|<00><00>i<01><00>dfcYd}~Sd}~wwxYw)u清空错误日志Tu错误日志已清空r<E7A9BA>rArBN)rrKrL)rRs r<00>clear_error_logr<67><00>sw<00><00>/<2F><16><1B>.<2E>
<EFBFBD>
<EFBFBD> <0B> <0B> <0B><> <15>/<2F>/<2F>/<2F><16><07><13>Q<EFBFBD><16><16>(<28>)<29>)<29>3<EFBFBD>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>s<00><00>
A<03>A<03>A<03>AN)#<23>__doc__rrr<>rrr<00>
sqlalchemyr <00>src.mainr
<00>src.core.databaser <00>src.core.modelsr r rrr<00>__name__<5F> monitoring_bpr"r*r.<00>routerSrqr<>r<>r<>r<>r<>r<>r<>r<>rrr<00><module>r<>s<><00><01><04><04>
)<29>(<28>(<28>(<28>(<28>(<28>(<28>(<28>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D><1B><1B><1B><1B><1B><1B>!<21>!<21>!<21>!<21>!<21>!<21>(<28>(<28>(<28>(<28>(<28>(<28>W<>W<>W<>W<>W<>W<>W<>W<>W<>W<>W<>W<>W<>W<><19> <09>,<2C><08>V<EFBFBD>D<>D<>D<> <0A>8<>8<>8<><18><18><18><16><16><16><0F><14><14>+<2B>,<2C>,<2C>$/<2F>$/<2F>-<2D>,<2C>$/<2F>L<0F><14><14>+<2B>,<2C>,<2C>K/<2F>K/<2F>-<2D>,<2C>K/<2F>Z<0F><14><14>-<2D>.<2E>.<2E>'/<2F>'/<2F>/<2F>.<2E>'/<2F>R<0F><14><14>.<2E><16><08><14>A<>A<> /<2F> /<2F>B<01>A<> /<2F><0F><14><14>,<2C>-<2D>-<2D>-/<2F>-/<2F>.<2E>-<2D>-/<2F>`<0F><14><14>(<28>)<29>)<29>:/<2F>:/<2F>*<2A>)<29>:/<2F>x<0F><14><14>3<>4<>4<>A/<2F>A/<2F>5<>4<>A/<2F>F<0F><14><14>5<>6<>6<>/<2F>/<2F>7<>6<>/<2F>@<0F><14><14>,<2C>-<2D>-<2D>//<2F>//<2F>.<2E>-<2D>//<2F>b<0F><14><14>,<2C>x<EFBFBD>j<EFBFBD><14>A<>A<> /<2F> /<2F>B<01>A<> /<2F> /<2F> /r