Files
life-echo/api/routers/__pycache__/websocket.cpython-312.pyc

55 lines
12 KiB
Plaintext
Raw Normal View History

2026-01-07 11:56:40 +08:00
<EFBFBD>
<1D>]ij,<00><00><00>dZddlZddlmZmZddlmZddlmZddlm Z m
Z
m Z ddl m Z ddlmZdd lmZmZdd
lmZdd lmZdd lmZmZdd lmZddlmZGd<0F>dee<05>ZGd<11>d<12>Z e <20>Z!de defd<15>Z"dedefd<17>Z#y)u'
WebSocket 路由:实时对话通信
<EFBFBD>N)<02>datetime<6D>timezone)<01>Enum)<01>Dict)<03> WebSocket<65>WebSocketDisconnect<63> HTTPException)<01>select)<01> AsyncSession)<02>ConversationAgent<6E> MemoryAgent)<01>ConversationStage)<01> get_async_db)<02> Conversation<6F>Segment)<01> asr_service)<01> tts_servicec<00>,<00>eZdZdZdZdZdZdZdZdZ dZ
y )
<EFBFBD> MessageTypeuWebSocket 消息类型<E7B1BB>connect<63> audio_chunk<6E>
transcript<EFBFBD>agent_response<73> tts_audio<69>end_conversation<6F>errorN) <0B>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__<5F>CONNECT<43> AUDIO_CHUNK<4E>
TRANSCRIPT<EFBFBD>AGENT_RESPONSE<53> TTS_AUDIO<49>END_CONVERSATION<4F>ERROR<4F><00><00>AC:\Users\physi\PycharmProjects\life-echo\api\routers\websocket.pyrrs)<00><00> <20><17>G<EFBFBD><1F>K<EFBFBD><1D>J<EFBFBD>%<25>N<EFBFBD><1B>I<EFBFBD>)<29><14> <13>Er)rc<00>R<00>eZdZdZd<02>Zdedefd<05>Zdefd<06>Zdede fd<08>Z
ded e fd
<EFBFBD>Z y ) <0C>ConnectionManageruWebSocket 连接管理器c<00>><00>i|_i|_t<00>|_y)N)<04>active_connections<6E>conversation_agentsr <00> memory_agent)<01>selfs r*<00>__init__zConnectionManager.__init__$s<00><00>8:<3A><04><1F>AC<41><04> <20>'<27>M<EFBFBD><04>r)<00> websocket<65>conversation_idc<00><00><>K<00>|j<00><00>d{<00><02><03>||j|<t<00>|j|<y7<00>+<2B>w)u 建立连接N)<04>acceptr.r r/)r1r3r4s r*rzConnectionManager.connect)s@<00><00><><00><17><1E><1E> <20> <20> <20>3<<3C><04><1F><1F><0F>0<>4E<34>4G<34><04> <20> <20><1F>1<> !<21>s<00>A<01>A<04>,Ac<00><><00>||jvr |j|=||jvr,|j|j|<01>|j|=yy)u 断开连接N)r.r/<00> clear_memory)r1r4s r*<00>
disconnectzConnectionManager.disconnect/sX<00><00> <1A>d<EFBFBD>5<>5<> 5<><14>'<27>'<27><0F>8<> <1A>d<EFBFBD>6<>6<> 6<> <10> $<24> $<24>_<EFBFBD> 5<> B<> B<>?<3F> S<><14>(<28>(<28><1F>9<> 7r)<00>messagec<00><00>~K<00>||jvr)|j|}|j|<02><00>d{<00><02><03>yy7<00><06>w)u 发送消息N)r.<00> send_json)r1r4r:r3s r*<00> send_messagezConnectionManager.send_message7s@<00><00><><00> <1A>d<EFBFBD>5<>5<> 5<><1C>/<2F>/<2F><0F>@<40>I<EFBFBD><1B>%<25>%<25>g<EFBFBD>.<2E> .<2E> .<2E> 6<> .<2E>s <00>2=<01>;<04>=<01>returnc<00><00><>K<00>||jvr'|j|}|j<00><00>d{<00><02><03>Stdd<03><04><00>7<00><11>w)u 接收消息Ni<4E>zConnection not found)<02> status_code<64>detail)r.<00> receive_jsonr )r1r4r3s r*<00>receive_messagez!ConnectionManager.receive_message=sI<00><00><><00> <1A>d<EFBFBD>5<>5<> 5<><1C>/<2F>/<2F><0F>@<40>I<EFBFBD>"<22>/<2F>/<2F>1<>1<> 1<><1B><03>4J<34>K<>K<>2<>s<00>1A<01>A<04>AN) rrrr r2r<00>strrr9<00>dictr=rCr(r)r*r,r,!sU<00><00>#<23>*<2A>
H<01>y<EFBFBD>H<01>3<EFBFBD>H<01> :<3A>#<23>:<3A>/<2F>#<23>/<2F><04>/<2F> L<01>S<EFBFBD>L<01>T<EFBFBD>Lr)r,r3r4c
<00><00><> K<00>tj||<01><00>d{<00><02><03> tj|tj|ddit j tj<00>j<00>d<04><04><00>d{<00><03><03>t<00>23d{<00><04><03>}|jt|<01><00>d{<00><03><03>}|saddl m}d}t||t j tj<00>d<08> <09>}|j|<03>|j!<00><00>d{<00><03><03>|j"rt%|j"<00>nt$j&} |j)<00><00>d{<00><04><03>}|jd
<EFBFBD>}|tj*k(<00>r|jd i<00>jd d <0A>} t-j.| <09><00>d{<00><04><03>}
t1t3t5j6<00><00>||
d<0E><0F>} |j| <0B>|j!<00><00>d{<00><04><03>tj|tj8|d|
it j tj<00>j<00>d<04><04><00>d{<00><04><03>tj:j|<01>} | <0C>r<>| j=||
<EFBFBD>} | |k7r+| }|j>|_|j!<00><00>d{<00><04><03>tAt0<00>jCt0jD|k(<00>jGt0jH<00>}|jK|<0E><00>d{<00><04><03>}|jM<00>jO<00>}|D<00>cgc]}|jPs<01>|jP<00><02>}}| jS||
||<12><11>}|| _*|j!<00><00>d{<00><04><03>tj|tjV|d|it j tj<00>j<00>d<04><04><00>d{<00><04><03>tYjZ|<13><00>d{<00><04><03>}tj|tj\|d |it j tj<00>j<00>d<04><04><00>d{<00><04><03>n<>|tj^k(r<>d|_0t j tj<00>|_1|j!<00><00>d{<00><04><03>te||<02><00>d{<00><04><03>tj|tj^|ddit j tj<00>j<00>d<04><04><00>d{<00><04><03><00><04><><EFBFBD><04>)7<00><05>W7<00><04><>7<00><04><>7<00><04><>7<00><04>l7<00><04>$7<00><03><>7<00><03>s7<00><03>7<00><02><>7<00><02>Qcc}w7<00><01><>7<00><01><>7<00><01>h7<00><01> 7<00><>7<00><>7<00>>#tf$ru}tj|tjhdt3|<15>it j tj<00>j<00>d<14><03><00>d{<00><05><03>7Yd}~<15><>d}~wwxYw6y#tj$rtjm|<01>Yytf$rtjm|<01><00>wxYw<01>w)u<>
WebSocket 端点:处理实时对话
Args:
websocket: WebSocket 连接
conversation_id: 对话 ID
N<>status<75> connected)<04>typer4<00>data<74> timestampr)<01>User<65> default_user<65>active)<04>id<69>user_id<69>
started_atrGrIrJ<00> audio_base64<36>F)rOr4<00>transcript_text<78> processed<65>text)r4<00> user_message<67> current_stage<67>covered_topics<63>endedr:)rIrJrK)7<>managerrr=rr!r<00>nowr<00>utc<74> isoformatr<00>getr<00>database.modelsrL<00>add<64>commit<69>conversation_stager<00> CHILDHOODrBr"r<00>
transcriberrD<00>uuid<69>uuid4r#r/<00> detect_stage<67>valuer
<00>wherer4<00>order_by<62>
created_at<EFBFBD>execute<74>scalars<72>all<6C>topic_category<72>generate_responserr$r<00>
synthesizer%r&rG<00>ended_at<61>process_conversation_segments<74> Exceptionr'rr9)r3r4<00>db<64> conversation<6F> UserModelrPrXr:<00>msg_type<70>
audio_datar<00>segment<6E>agent<6E>detected_stage<67> stmt_segments<74>result_segments<74>previous_segments<74>segrY<00>responser<00>es r*<00>websocket_endpointr<74>Hs<><00><00><><00> <12>/<2F>/<2F>)<29>_<EFBFBD>
5<EFBFBD>5<>5<>I<0E><15>"<22>"<22>?<3F><1F>'<27>'<27>.<2E><1D>{<7B>+<2B>!<21><1C><1C>h<EFBFBD>l<EFBFBD>l<EFBFBD>3<>=<3D>=<3D>?<3F> 5
<EFBFBD> <0B> <0B> <0B>%<25><0E>y <17>"<22>!#<23><16><16> <0C>o<EFBFBD>!F<>F<>L<EFBFBD><1F>=<3D>(<28><07>+<2B>&<26>#<23>'<27>|<7C>|<7C>H<EFBFBD>L<EFBFBD>L<EFBFBD>9<>#<23>  <12> <0C> <13><06><06>|<7C>$<24><18>i<EFBFBD>i<EFBFBD>k<EFBFBD>!<21>!<21>R^<5E>Rq<52>Rq<52>-<2D>l<EFBFBD>.M<>.M<>N<>xI<02>xS<02>xS<02>M<EFBFBD><17>d<17>$-<2D>$:<3A>$:<3A>$<<3C><<3C>G<EFBFBD>&<26>{<7B>{<7B>6<EFBFBD>2<>H<EFBFBD><1F>;<3B>#:<3A>#:<3A>:<3A>%,<2C>[<5B>[<5B><16><12>%<<3C>%@<40>%@<40><1E>QS<51>%T<>
<EFBFBD>,7<>+A<>+A<>*<2A>+M<>%M<>
<EFBFBD>#*<2A>"<22>4<EFBFBD>:<3A>:<3A><<3C>0<>,;<3B>,6<>&+<2B> #<1A><07> <1B><06><06>w<EFBFBD><0F> <20>i<EFBFBD>i<EFBFBD>k<EFBFBD>)<29>)<29>&<26>2<>2<>?<3F>$/<2F>$:<3A>$:<3A>/><3E>%+<2B>Z<EFBFBD>$8<>)1<><1C><1C>h<EFBFBD>l<EFBFBD>l<EFBFBD>)C<>)M<>)M<>)O<> E<1A><1B><1B><1B>!(<28> ;<3B> ;<3B> ?<3F> ?<3F><0F> P<><05> <20>-2<>-?<3F>-?<3F><0F>Q[<5B>-\<5C>N<EFBFBD>-<2D><1D>><3E>0><3E> <0A>BO<42>BU<42>BU<42> <0C> ?<3F>&(<28>i<EFBFBD>i<EFBFBD>k<EFBFBD> 1<> 1<>-3<>7<EFBFBD>O<EFBFBD>,A<>,A<> '<27> 7<> 7<>?<3F> J<>-<1E>&<26>h<EFBFBD>w<EFBFBD>'9<>'9<>:<3A>*<2A>57<35>J<EFBFBD>J<EFBFBD>}<7D>4M<34>.M<>O<EFBFBD>0?<3F>0G<30>0G<30>0I<30>0M<30>0M<30>0O<30>-<2D>L]<5D>-t<>L]<5D>S<EFBFBD>ad<61>as<61>as<61>c<EFBFBD>.@<40>.@<40>L]<5D>N<EFBFBD>-t<>(-<2D>'><3E>'><3E>0?<3F>-7<>.;<3B>/=<3D> (?<3F>(<1E>H<EFBFBD>6><3E>G<EFBFBD>2<>"$<24>)<29>)<29>+<2B>-<2D>-<2D>#*<2A>"6<>"6<><EFBFBD>(3<>(B<>(B<>3B<33>)/<2F><18>(:<3A>-5<>\<5C>\<5C>(<28>,<2C>,<2C>-G<>-Q<>-Q<>-S<> I<1E>#<1F><1F><1F>/:<3A>.D<>.D<>X<EFBFBD>.N<>(N<>I<EFBFBD>#*<2A>"6<>"6<><EFBFBD>(3<>(=<3D>(=<3D>3B<33>)7<><19>(C<>-5<>\<5C>\<5C>(<28>,<2C>,<2C>-G<>-Q<>-Q<>-S<> I<1E>#<1F><1F><1F>"<22>[<5B>%A<>%A<>A<>.5<EFBFBD> <0C>+<2B>08<30> <0C> <0C>X<EFBFBD>\<5C>\<5C>0J<30> <0C>-<2D> <20>i<EFBFBD>i<EFBFBD>k<EFBFBD>)<29>)<29><<3C>O<EFBFBD>R<EFBFBD>P<>P<>P<>%<25>2<>2<>?<3F>$/<2F>$@<40>$@<40>/><3E>%-<2D>w<EFBFBD>$7<>)1<><1C><1C>h<EFBFBD>l<EFBFBD>l<EFBFBD>)C<>)M<>)M<>)O<> E<1A><1B><1B><1B> <1E>}<17>A6<><36> <0B><>y <17><>F<><46>"<22><>=<3D><>&N<01><>*<2A><><1B><>!2<><32> /N<01><>-t<>.<2E><><1F><>)O<01><><1F><>*<2A><>Q<01><><1B><>!<21><17>!<21>.<2E>.<2E><EFBFBD> +<2B> 1<> 1<>!*<2A>C<EFBFBD><01>F<EFBFBD> 3<>%-<2D>\<5C>\<5C>(<28>,<2C>,<2C>%?<3F>%I<>%I<>%K<>A<16><17><17><17><><17><>i'<27><>v <1F>,<2C><0F><1A><1A>?<3F>+<2B> <14><0E><0F><1A><1A>?<3F>+<2B> <0A><0E>s<EFBFBD><00>Y0<01>U3<04>Y0<01>AX.<00>?U6<04>X.<00>X,<02>U9<06>X,<02>X.<00>0U<<06>1A"X.<00>U?<06>6X.<00> V+<02>V<06>A#V+<02>V<06>AV+<02>V<06>A!V+<02>7V <06>8A#V+<02>V<06>A$V+<02>V<06>&V+<02>'V<06>9V<06>1V+<02>8V<06>9A!V+<02>V<06>V+<02>7V<06>8A!V+<02>V"<06>AV+<02>4V%<06>5V+<02>V'<06> A!V+<02>*V)<06>+V+<02>/X.<00>3Y0<01>6X.<00>9X,<02><X.<00>?X.<00>V+<02>V+<02>V+<02> V+<02>V+<02>V+<02>V+<02>V+<02>V+<02>"V+<02>%V+<02>'V+<02>)V+<02>+ X)<05>4A%X$<05>X<08>X$<05>X.<00>$X)<05>)X.<00>-Y0<01>.Y-<03> Y0<01>Y-<03>-Y0rvc<00><00>.K<00>tt<00>jtj|k(tjdk(<00>}|j |<02><00>d{<00><02><03>}|j <00>j<00>}|sy|D<00>cgc]}d|ji<01><02>}}tj}|j|<06>}ddl m } |jt|<00><00>d{<00><02><03>}
|j!<00>D]q\} } | t#t%j&<00><00>|
j(| d| d| jdd <09>d
| | jd g<00><00> <0C>} |j+| <0A><00>s|D] }d |_<00> |j-<00><00>d{<00><02><03>y7<00><01>1cc}w7<00><>7<00><0F>w)uy
处理对话段落,生成章节
Args:
conversation_id: 对话 ID
db: 数据库会话
FNrTr)<01>Chapter<65>title<6C>content<6E> order_indexi<78><00> completed<65>image_suggestions)rOrPr<>r<>r<>rG<00>category<72>imagesT)r
rrjr4rUrmrnrorTr[r0<00>process_segments<74>databaser<65>r_r<00>itemsrDrfrgrPrarb)r4rv<00>stmt<6D>result<6C>segmentsr<73><00> segments_datar0<00> chapters_datar<61>rwr<><00> chapter_data<74>chapters r*rtrt<00>s<00><00><><00> <12>'<27>?<3F> <20> <20><0F><1F><1F>?<3F>2<><0F><19><19>U<EFBFBD>"<22> <06>D<EFBFBD><16>:<3A>:<3A>d<EFBFBD>#<23> #<23>F<EFBFBD><15>~<7E>~<7E><1F>#<23>#<23>%<25>H<EFBFBD> <13><0E>
<1C><06><1B>C<EFBFBD>
<1B>C<EFBFBD>/<2F>/<2F>0<><1B><12><06> <1B>'<27>'<27>L<EFBFBD> <20>1<>1<>-<2D>@<40>M<EFBFBD>!<21><1B><16><16> <0C>o<EFBFBD>><3E>><3E>L<EFBFBD>"/<2F>"5<>"5<>"7<><1E><08>,<2C><19><12>4<EFBFBD>:<3A>:<3A><<3C> <20> <20>(<28>(<28><1E>w<EFBFBD>'<27> <20><19>+<2B>$<24>(<28>(<28><1D><03><<3C><1E><1D><1F>#<23>#<23>$7<><12><<3C> 
<EFBFBD><07> <0B><06><06>w<EFBFBD><0F>#8<><18><03><1C><03> <0A><18> <0A>)<29>)<29>+<2B><15><15>K$<24><><06>?<3F><>&<16>sD<00>AF<01>F <04>)F<01>F <04>AF<01>F<04>B)F<01>F<04>F<01> F<01>F)$r rfrr<00>enumr<00>typingr<00>fastapirrr <00>
sqlalchemyr
<00>sqlalchemy.ext.asyncior <00>agentsr r <00>agents.promptsrr<>rr`rr<00>services.asr_servicer<00>services.tts_servicerrDrr,r[r<>rtr(r)r*<00><module>r<>s<><00><01><04> <0C>'<27><15><17>A<>A<><1D>/<2F>1<>,<2C>!<21>1<>,<2C>,<2C><14>#<23>t<EFBFBD><14>!L<01>!L<01>H <1C>
<1D><07>S<0E> <09>S<0E>C<EFBFBD>S<0E>l2<16><13>2<16>,<2C>2r)