77except ImportError :
88 from config .settings import SAVED_AUTH_DIR
99
10- from ..service import WORKER_POOL_AVAILABLE , worker_pool
10+ from ..service import WORKER_POOL_AVAILABLE , manager , worker_pool
1111
1212
1313router = APIRouter (prefix = "/api/workers" , tags = ["Workers" ])
@@ -54,6 +54,12 @@ async def add_worker(profile: str = Body(..., embed=True)):
5454 )
5555 pool .workers [worker_id ] = worker
5656 pool .save_config ()
57+ if manager .is_worker_mode and manager .service_status == "running" :
58+ pool .configure_runtime (manager .load_config ())
59+ success , message = pool .start_worker (worker_id )
60+ if not success :
61+ raise HTTPException (status_code = 500 , detail = message )
62+ await manager .broadcast_worker_snapshot ()
5763 return {"success" : True , "worker" : worker .to_dict ()}
5864
5965
@@ -65,11 +71,16 @@ async def remove_worker(worker_id: str):
6571 raise HTTPException (status_code = 404 , detail = "Worker not found" )
6672
6773 worker = pool .workers [worker_id ]
74+ process = worker .process
6875 if worker .status == "running" :
69- pool .stop_worker (worker_id )
76+ success , message = await pool .stop_worker (worker_id )
77+ if not success :
78+ raise HTTPException (status_code = 500 , detail = message )
79+ manager .unregister_worker_process (process )
7080
7181 del pool .workers [worker_id ]
7282 pool .save_config ()
83+ await manager .broadcast_worker_snapshot ()
7384 return {"success" : True }
7485
7586
@@ -86,6 +97,7 @@ async def list_workers():
8697async def init_workers ():
8798 pool = _require_worker_pool ()
8899 pool .init_from_config ()
100+ await manager .broadcast_worker_snapshot ()
89101 return {"success" : True , "count" : len (pool .workers )}
90102
91103
@@ -94,6 +106,7 @@ async def save_workers_config():
94106 pool = _require_worker_pool ()
95107 try :
96108 pool .save_config ()
109+ await manager .broadcast_worker_snapshot ()
97110 return {"success" : True , "count" : len (pool .workers )}
98111 except Exception as exc :
99112 return {"success" : False , "error" : str (exc )}
@@ -124,44 +137,57 @@ async def get_next_available_worker(model: str = ""):
124137async def mark_worker_rate_limited (worker_id : str , model : str = Body (..., embed = True )):
125138 pool = _require_worker_pool ()
126139 pool .mark_rate_limited (worker_id , model )
140+ await manager .broadcast_worker_snapshot ()
127141 return {"success" : True }
128142
129143
130144@router .post ("/{worker_id}/start" )
131145async def start_worker_api (worker_id : str ):
132146 pool = _require_worker_pool ()
147+ pool .configure_runtime (manager .load_config ())
133148 success , message = pool .start_worker (worker_id )
134149 if not success :
135150 raise HTTPException (status_code = 400 , detail = message )
151+ await manager .broadcast_worker_snapshot ()
136152 return {"success" : True , "message" : message }
137153
138154
139155@router .post ("/{worker_id}/stop" )
140156async def stop_worker_api (worker_id : str ):
141157 pool = _require_worker_pool ()
142- success , message = pool .stop_worker (worker_id )
158+ process = pool .workers .get (worker_id ).process if worker_id in pool .workers else None
159+ success , message = await pool .stop_worker (worker_id )
143160 if not success :
144161 raise HTTPException (status_code = 400 , detail = message )
162+ manager .unregister_worker_process (process )
163+ await manager .broadcast_worker_snapshot ()
145164 return {"success" : True , "message" : message }
146165
147166
148167@router .post ("/{worker_id}/clear-limits" )
149168async def clear_worker_limits (worker_id : str ):
150169 pool = _require_worker_pool ()
151170 if pool .clear_rate_limits (worker_id ):
171+ await manager .broadcast_worker_snapshot ()
152172 return {"success" : True }
153173 raise HTTPException (status_code = 404 , detail = "Worker not found" )
154174
155175
156176@router .post ("/start-all" )
157177async def start_all_workers ():
158178 pool = _require_worker_pool ()
159- pool .start_all ()
179+ pool .configure_runtime (manager .load_config ())
180+ await pool .start_all ()
181+ await manager .broadcast_worker_snapshot ()
160182 return {"success" : True }
161183
162184
163185@router .post ("/stop-all" )
164186async def stop_all_workers ():
165187 pool = _require_worker_pool ()
166- pool .stop_all ()
188+ processes = [worker .process for worker in pool .workers .values () if worker .process ]
189+ await pool .stop_all ()
190+ for process in processes :
191+ manager .unregister_worker_process (process )
192+ await manager .broadcast_worker_snapshot ()
167193 return {"success" : True }
0 commit comments