From 1e93def9093c980040220ebb4f9b689f6e7e0d89 Mon Sep 17 00:00:00 2001 From: sal Date: Mon, 1 Jun 2026 17:39:52 +0900 Subject: [PATCH] Refactor: split services.py into services/ package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ChatService → services/chat.py DocumentService → services/document.py TTSService → services/tts.py services/__init__.py re-exports all three for backward-compatible imports Co-Authored-By: Claude Sonnet 4.6 --- .idea/.gitignore | 10 +++++ .idea/misc.xml | 9 ++++ .idea/modules.xml | 8 ++++ .idea/vcs.xml | 6 +++ .idea/youlbot-webui.iml | 9 ++++ __pycache__/api_client.cpython-312.pyc | Bin 0 -> 9005 bytes __pycache__/app.cpython-312.pyc | Bin 0 -> 18332 bytes __pycache__/config.cpython-312.pyc | Bin 0 -> 2092 bytes __pycache__/container.cpython-312.pyc | Bin 0 -> 2379 bytes __pycache__/services.cpython-312.pyc | Bin 0 -> 5711 bytes services/__init__.py | 5 +++ services/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 349 bytes services/__pycache__/chat.cpython-312.pyc | Bin 0 -> 1696 bytes services/__pycache__/document.cpython-312.pyc | Bin 0 -> 1475 bytes services/__pycache__/tts.cpython-312.pyc | Bin 0 -> 2929 bytes services/chat.py | 26 ++++++++++++ services/document.py | 15 +++++++ services.py => services/tts.py | 40 ------------------ 18 files changed, 88 insertions(+), 40 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/youlbot-webui.iml create mode 100644 __pycache__/api_client.cpython-312.pyc create mode 100644 __pycache__/app.cpython-312.pyc create mode 100644 __pycache__/config.cpython-312.pyc create mode 100644 __pycache__/container.cpython-312.pyc create mode 100644 __pycache__/services.cpython-312.pyc create mode 100644 services/__init__.py create mode 100644 services/__pycache__/__init__.cpython-312.pyc create mode 100644 services/__pycache__/chat.cpython-312.pyc create mode 100644 services/__pycache__/document.cpython-312.pyc create mode 100644 services/__pycache__/tts.cpython-312.pyc create mode 100644 services/chat.py create mode 100644 services/document.py rename services.py => services/tts.py (58%) diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..30cf57e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..5c38e4b --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..fbf2f7e --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/youlbot-webui.iml b/.idea/youlbot-webui.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/youlbot-webui.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/__pycache__/api_client.cpython-312.pyc b/__pycache__/api_client.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b7ab73774471771064227507fe906c4d9164645 GIT binary patch literal 9005 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 literal 0 HcmV?d00001 diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8250133be37e557c257a26d8eaf6a432dd7d57b GIT binary patch literal 18332 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 RKE3SjDk;LrC-<$F{(pFA1pfd4 literal 0 HcmV?d00001 diff --git a/__pycache__/config.cpython-312.pyc b/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a38387fca1f4d465120941887de8452bebba3f7c GIT binary patch literal 2092 zcmb_dO-vg{6rTO@&+_L&3N(;Vsw!=*25dEr8X_905Eopi2{xp~t+ZNu2iUOox-)B# zIr)%E9CM?`9*aPVDj_wID&-of7bEWhwuh?fDK{z(m3r!XyS9ass#4U9rO)%`n|<@% z?EBvS(%s!bU?`K9@6|;@{y?KS0*%SpmoV8SI?)A_6ojl$5VN9ywrEOOi3%c_A-Z&* z=<+`Jz_IWDk*wTc1HcAfU;`B~8hVC%qoS+mnyuwcjdM4!YEV;8~ex}2Wh?q9d< z(#=@RwDOv{ZgKnOjd(o1C%U4=-QXIvX>oIpoT1CVuf~=+Wjw|;Gqz>14PMgnG*+?7 zX3nz5wrH+w#PVLqK|iAp-DkIfP-I zzXkv~u!ohsN^N5PY0il)de6E6+uESTXNR!C4cSJ4T4g&G?Qp}YTGR?uRoxC%Em(Tl z#CeyhepA*=pJDixSsy+rahtgjRn>|`%hqheDsok21IWMO@kY^pKHwm-2&f!>72sR) zd*t<_D>)~UuTJk=sLT12-hrcc7oFa8HL-K8E~k$#3{+=!GLAgpXO54z-8L2-jRegZUP|0Ge>Oqm`*bof^E4NrsZTc#+P?nZ5>fMFp zbi$Qa%0=y^V#j;sm_U^re(=-8j}wo+disuYtx^AqZF6&OtdXK+roG(tV+(3tzxYIXtkkB`wWT%Z#=3v~J(vX5*QlS#b|^mX{oGFI zgq!eMuw@#DBT!(?m6F9k=RNEqxMo8L!w8H{xD^X5^MC|-al!U=k0&pgQdFq*69uX8S Ooe}_#_)~0D%b=#V2z5&fRv_4=NuefS^&$d;qFuLg^sBQ{ zgM<%0xJ89PPQ~h>(4&P9X`#?V|Aby7oM3lxXrZSN2UP1&=&A3`u6|T)QhLiC-n{p{ zH#_rvGyC?ZV9-zCxx5_Se9KM9Zy59*$#J^Z!PzA`NfBMp#hj2AQ=)*rE9c5fDT(`1 z&Ykz9Jb7=*o0n6vKt%E$(cL>l_w0-In^L~2HzrpuKy*@XJiY&wx_U!B`El>rXZKFN z{{HDseenqv#sn*PJ(;|D?dFY@T-GR*0q|Wbl~#&{jqFD;m!+(HoGz~$?9*(#eWyI-;iwmC z+(W3$Q6He5A=J-N1yJu08sKOUP1@GZmM6mrW*oKn`sm}vyYGY9 zC0oK4p*(>`ClCp}kVpNwJnB)lD|_cjs-!8b#oU&c+ACTLO_#DX!^O6OGz0Qd)6w?~ z)g6KRP=J=pW-p3~mSh^a4TcxV#PwD6&v^Vpm~Y0-bS{3k$nKb>bjFBRix-?HJjKof@V71C@_Y+5aGtk??YVOQ^k9?yvx6zl zv+3!1gK^)XI($oBOi^NEFrDFAoUG-7tH3ToIKkpM0+7|5V=}keHfTN3QZh_BJEJ5B}ZPM&j!5jx%y20mp=br z3m3x^WY7l*n?f@xLtyyJsJ$`}Vi>;!GtJ9j94W$WCEQY?#~MmOoAf|Spa?Tu1g#y? zTC(<1i7<}T@pApU2;-yupf))WVl)>S5kqS$T1$x?N0+`${y@K@2hn#?j9D&5v>l4J zCF)Cp_n2RaPF(Gdxz+sbrHnLAcr+gp0D++03T-$n_-TmrQn zQd_dhC0L7vurC(Ud4p2RPielWS90hFDE*|8&e<7;y@8zrW632}EE%j^kMzu>|=!_B1SVt7x(+%G#fuZZ_ z0UZzbTyC}T!6|{kNrBh#JE_^m9Zb#kQ?vcl{5Nq-&G%FD{gl>7VM^nv-$n539pgUN z;3w*(_>-d4zOcNP;opcWW692+%(OpjE&xAJPIVsZutjtFmb`3>e3iuj!)|KMfa$md dLHL=3ACtMqWcnA9Xp_Vro>@UVC1CjczX0%5-;V$Q literal 0 HcmV?d00001 diff --git a/__pycache__/services.cpython-312.pyc b/__pycache__/services.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eaf719635cb10f816548a3979138a9632bb84e79 GIT binary patch literal 5711 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 literal 0 HcmV?d00001 diff --git a/services/__init__.py b/services/__init__.py new file mode 100644 index 0000000..ec02651 --- /dev/null +++ b/services/__init__.py @@ -0,0 +1,5 @@ +from services.chat import ChatService +from services.document import DocumentService +from services.tts import TTSService + +__all__ = ["ChatService", "DocumentService", "TTSService"] diff --git a/services/__pycache__/__init__.cpython-312.pyc b/services/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eeb58097208c6d3d16393700fb79a4bc5e28b2b8 GIT binary patch literal 349 zcmX@j%ge<81g@^KSzCbgV-N=hn4pZ$20+Gih7^Vr#vF!R#wbQc5SuB7DVI5l8O&zR zVaa8UVr67VXGmdL#2Cd^$*Rfr5~N*|@fNppMq){DYEfBcaw?F^?~T4#Sb>C}Ci^YkVufb6Ib0JuC@;m zP|8|cFB*R$EYc`@MYQYAwUBW;3^;rky>k89Ro`Rv@H!8|zzKW@O^1>hfL<5CHesYp zT~bzD%G8SDDjQl^b5*9h8Z4a|uE7$_WICJ@odh8jndVP#m_%?^ECw92?Su*$R(#e9^$x@w2ZjNkAa7NzWlXE`!)XTVgZidco!I|XW+ zbZM7Z@&Z+x+@p&?TC>2rs6?7zeuYDxM4;cq#N!L4cLn33By7Lb3i!Hc*bXbTgQmX{ zgmW#n()3DTfGLQQ1NqE1+L38lUfl~Vt5Z0Z;{5QdjGu(~x5&f7i=S$rCwp)pQKH6# zu&XReG$EwrxlvZE1}!UG_3GxbcW4GHyxHFco_f?By0HfDOp2{rvyr& zbk+UA%`)MbQc>YJbCHHziW*PDf#*?;pc(}w@Yg3mI1U3Zfa;7K=ZUTuL_7!T7Ksfq zQrK#5wzqC>-rT9~w!Y6E<`?dp3p@w+Cz^%1+=kVA57aw^J|mxf3T_~`;R$>MvA$Hc z)lYOC;YND{0%u7R84mj1r#1#3I-|#_Nqa1ZcplUroE?$nmI z>1_p@!A|usH+^JIKQN~s3oOpZ=Zo|%ozcEBV8~3_)tabArY%HhAu{0E^*h_FL&F^d zoQ8s9B8%}pfM+iTHn*#F^?e)=kpEqjtgvq|tHPMOVms?a<4JM&IK<&+P~j8i=RgTe z8K+@54_KJa+2ch!5f7iCm<1(^7mtwqX)NDSZt5U6wOif$@P{)$Ui|6eVQ%TjTzX(G z4GK9qN57%3Xx|!hw3x*QR<~=+vZ9n_)dIKaBhFaX2Tj}W-*B8#o&^=DBIJ>_5(GZS z0gLpo+3=YhT#hY{RIeU#%=;dZGuiJx662_FiLXIzkXWJm`TLWv^$6^-q3Ulw96uMU zxKGXY_t)Q$`=jL8o#xK+?&O|!_vIbyV0`W%Ip5R4GEPx_X7@r2A!hbuq?y<-^=0~K zv=HkE;KiICixU!>2$K?~2pFU#%mBROevyi^@|Yv3+~0YG{roZG#iAY=VY>n2C27mQ vwSHA3vzNf;3ERlL+^^#TpN0#3NCLYZtCZ4T$;9tu_8+4_m+4;wwRHRsn1FM~ literal 0 HcmV?d00001 diff --git a/services/__pycache__/document.cpython-312.pyc b/services/__pycache__/document.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da327766f93495c1a56de66d4ed0213c974911cc GIT binary patch literal 1475 zcmb7E&1(};5PxsK+@vy(g>D0G(AW?DypsS`#R^~o$PQA!kYjxgmBVd|QaSe2BTX6c_%uxPaB?4|Q#zQ-%! zB@u*y8~AQwmeB3U7eKBPPD+%KlENrgrxl2+l{BVuooU>d)|d|RF5peB9|U`_FhG-H zyU>D}V37hjT{Eq8lpPP;>MWdlg^RnM%cFF8&U4&26}O#goCESIe62npb+Skoi4$)i zsgYGW2{1GVye%ctB=@I<0Xq`?1_ytfw694nq%F(7Js*hMa<1%hyB1Xa8$mcS&u>&c z8w@Z7X|r}t$L4C0={R1+3ms?SKv$~AIy*X^lLB&|yx%wQM0=iUfk2|vwC8hYt{mQq z48g;ysO&(5Xdc4Xx(ehXp@@pi0N=f4(6VbS(luy5u7}X*dtmWOsjH85om?R&$usSZ zI!}cO+m<3QwaD-)H@OT!!~qf+Ann?S9#rfBvar7!V&a5x*+CEe`R|cr(5y zL#NY8Y0((B#B>G|#Cw5V80bd4(+x`_^FVeYAKA!_Z077{)^3<~BWt&D4;1JU9nzNd z0*wqARE5hY|J?HH5b}Qu@b{KexB$>}{kNuP8TWa}x69D!{yv12+>E3a`$4gg@2*9c zcRVu#+r`NAz3`rT%}iklwlFdoZD!=?!Am%v0o?EP qB*`y6t{>FDQi#mc38FIsi-Qv;@sZk6DWxCC@HeA}7QYZ6vCmHjMn8Z6 literal 0 HcmV?d00001 diff --git a/services/__pycache__/tts.cpython-312.pyc b/services/__pycache__/tts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db088546c45dc30919a6aaebbaa2fc7397ea4cff GIT binary patch literal 2929 zcmb7GZ)_Vy7N6NajyJYrd!4$u{ObnypIhQIS8*T&Em7Q1Kutd+9FQ-|*1IltZLe>3 zoy58H)H@1Isz_~7?*alrDv(H(BH$Bz-~(6XawpvvOpEMp@&%5QKv2oLR0mXi;LY0G zln@mdY2N$Io0&KB-kW(d|MvMB5tRM|9cj&l(0^#dDO??_#sSPC6{$FbMrs_7V7twX zFg9mLSl~>C%km>UMhtowsq9IlatlmN%ZRIpqx_e&F&M>`(3j8m>$zm=Xrk6%qkO%w z8UrwkG(?wyC9uXO8I?K7jc_Wf@hS(EpJ+fR$*C@ox{7?X!D<{H9vaffXeyyuu0&0H zeR*3i#Vpj-gSPfboVLY3CX-0Ujs!+HPH;rPVFcA;mm<1|2cw)Nn5H3*>h{WY-b6*3 zdQ_{oJ-0QYjKvvRCP~2O$e{a@q?^C(dEC&5(PJo?o-v&qGxAD8>nZAm%n{w}9@CB# zQavz$nrHNY@>srTxn(((OPR7f5n3}o<_KwQjSe6uP$k@64sS1ow@-01o=RI+xouCW zZO;_m>BAk_`)Hao2~K8=sMR6!LkH7?Xo#pU>Yq}$eZ=%8r~mbE*rHSTyey=6`2ppAFFP>=5~xAa~# z^IQa(VMp&)L|BZTLNk9EL*wjIXbi)Mu8l_IIA=uNTY=Nu&v?uC>%29^P2nj%$*N5! z-N)HGpPotfN47)6Yf-)z-6_r+*;T}jU2m~tIO;Dv4!*hm=SyE*c;)NUZ(Kh=^VO>h z*Ux+)!6lAKStW6J=zhsiil06I0?i=ZaN7aqi@?YCN2#TP{`0Xr^Ydpn8Jo9)+q8LqDH*MoS#Cni5JLZoek$1v6hT z3BAn|Tr8X43v^5wO*rwSoF4xW)YU%$`72A4LHbrA08za-7xg%#%`{w-^<|owW;aT* z&N0Pw9whqp#nFpV5fL}^LK5a^DzvDU>wHkR%ITm{$qbHP%u`gy1ppTV7 z$+wVaeR>YBd^# zBYC3317TP!*i7gPKOoN^q7ePrshc7ILYCVrqn@Pk5HVVj=;I zx`+>$?Htlg(Or~Clym_xX!4exmZXOss(Z`!%|u|mx2P)(70$-ZFQ|t;^@l2<&7XTh zXZBC;zv5}1bARmFS!F!FO)KHfa=5n??tOprzcyVBA3n=g0-;&qoN(T=67DF6ca*|A zR+>9!2hR;wHnqMOpWFK8?hCu;&3A_0d-B~U-#0&Mj#pYcE0G;H1b(yl4dR1h)h1rl z(l$GOZv3pj>TVE%%igvXv9&CAm&EROe*fWttKy?m{S~kO%p=o}%sf`1UE53I_BnHY zxZM3$@9GsJY{R z2>Ui&3p7_*;5VyH$Tx_;``q6Gav^xl8vwZwyjgX5gqCG*>mBy-e}?sKz2Qb7*iNJ* zM&=G&5qFinyGq_&x7Pi3rKY&$T4*y>-15EgI(YlJwgCxW=-VA{Mwh)fE^?QBeu~>M z$S-&HMdI7gBF6Cux5)S@4$_WA5yPOxW+5)IiyaJ=Y{3*uEX5H_M{X11z3gJl?%jha z?zMaG>1!MaqJQki0}Qu>0)UqSROwPs80cV^TIqx(SRZf)odDl8_`A@{Da%%)EN6AK zkfGQs%YP^+nOYB_8H4zNK+ZA=*#qbzvM-K(<_P^t*o6KOjBP+pqAJ7iy)PD55wNOz z2j4QsRuQmyc3!>Mc!R>420A&~K;T<~NQ9DIlu#x1zpS>ny}~_IMz3q_q`M!eZFe8} k9mr_bGdh7l1TbDkP0Pr?jDkS_i`u_&-HjpkK AsyncIterator[tuple[str, str | None]]: + return self._api.chat(message, user_id, show_thinking) + + async def reset(self, user_id: str) -> None: + await self._api.reset(user_id) + + async def save_feedback( + self, + user_id: str, + user_msg: str, + asst_msg: str, + rating: int, + run_id: str | None, + ) -> None: + await self._api.save_feedback(user_id, user_msg, asst_msg, rating, run_id) diff --git a/services/document.py b/services/document.py new file mode 100644 index 0000000..d4c5661 --- /dev/null +++ b/services/document.py @@ -0,0 +1,15 @@ +from api_client import APIClientProtocol + + +class DocumentService: + def __init__(self, api_client: APIClientProtocol): + self._api = api_client + + async def ingest(self, file_path: str) -> dict: + return await self._api.ingest(file_path) + + async def list_documents(self) -> list[str]: + return await self._api.list_documents() + + async def delete_document(self, source: str) -> None: + await self._api.delete_document(source) diff --git a/services.py b/services/tts.py similarity index 58% rename from services.py rename to services/tts.py index 2c64341..c5425d7 100644 --- a/services.py +++ b/services/tts.py @@ -1,51 +1,11 @@ -"""ChatService, DocumentService, TTSService.""" import asyncio import platform import subprocess import tempfile -from typing import AsyncIterator -from api_client import APIClientProtocol from config import AppConfig -class ChatService: - def __init__(self, api_client: APIClientProtocol): - self._api = api_client - - def chat( - self, message: str, user_id: str, show_thinking: bool - ) -> AsyncIterator[tuple[str, str | None]]: - return self._api.chat(message, user_id, show_thinking) - - async def reset(self, user_id: str) -> None: - await self._api.reset(user_id) - - async def save_feedback( - self, - user_id: str, - user_msg: str, - asst_msg: str, - rating: int, - run_id: str | None, - ) -> None: - await self._api.save_feedback(user_id, user_msg, asst_msg, rating, run_id) - - -class DocumentService: - def __init__(self, api_client: APIClientProtocol): - self._api = api_client - - async def ingest(self, file_path: str) -> dict: - return await self._api.ingest(file_path) - - async def list_documents(self) -> list[str]: - return await self._api.list_documents() - - async def delete_document(self, source: str) -> None: - await self._api.delete_document(source) - - class TTSService: def __init__(self, config: AppConfig): self._voice = config.tts_voice