@@ -137,19 +137,44 @@ def post_move(
137137
138138 mode = request .mode
139139 if mode in {"fast" , "strong" }:
140- inference_service = _resolve_inference_service (http_request )
141- result = inference_service .predict (board = board , mode = mode )
142- move_payload : MovePayload | None = None
143- if result .move is not None :
144- r1 , c1 , r2 , c2 = result .move
145- move_payload = MovePayload (r1 = r1 , c1 = c1 , r2 = r2 , c2 = c2 )
146-
147- return MoveResponse (
148- move = move_payload ,
149- action_idx = result .action_idx ,
150- value = result .value ,
151- mode = result .mode ,
152- )
140+ try :
141+ inference_service = _resolve_inference_service (http_request )
142+ result = inference_service .predict (board = board , mode = mode )
143+ move_payload : MovePayload | None = None
144+ if result .move is not None :
145+ r1 , c1 , r2 , c2 = result .move
146+ move_payload = MovePayload (r1 = r1 , c1 = c1 , r2 = r2 , c2 = c2 )
147+
148+ return MoveResponse (
149+ move = move_payload ,
150+ action_idx = result .action_idx ,
151+ value = result .value ,
152+ mode = result .mode ,
153+ )
154+ except HTTPException as exc :
155+ if exc .status_code != status .HTTP_503_SERVICE_UNAVAILABLE :
156+ raise
157+ # Keep PvE matches playable when model artifacts are missing in runtime.
158+ logger .warning (
159+ "Inference unavailable on /gameplay/move; falling back to heuristic_hard" ,
160+ extra = {"detail" : exc .detail },
161+ )
162+ rng = np .random .default_rng ()
163+ fallback_move = heuristic_move (board = board , rng = rng , level = "hard" )
164+ if fallback_move is None :
165+ return MoveResponse (
166+ move = None ,
167+ action_idx = ACTION_SPACE .pass_index ,
168+ value = 0.0 ,
169+ mode = "heuristic_hard" ,
170+ )
171+ r1 , c1 , r2 , c2 = fallback_move
172+ return MoveResponse (
173+ move = MovePayload (r1 = r1 , c1 = c1 , r2 = r2 , c2 = c2 ),
174+ action_idx = ACTION_SPACE .encode (fallback_move ),
175+ value = 0.0 ,
176+ mode = "heuristic_hard" ,
177+ )
153178
154179 rng = np .random .default_rng ()
155180 if mode == "random" :
0 commit comments