rydlrKE commited on
Commit
e29ac23
·
verified ·
1 Parent(s): 3dcb38f

fix: fallback to local text encoder API when remote URL times out

Browse files
Files changed (1) hide show
  1. kimodo/model/load_model.py +30 -11
kimodo/model/load_model.py CHANGED
@@ -167,6 +167,15 @@ def _build_api_text_encoder_conf(text_encoder_url: str) -> dict:
167
  }
168
 
169
 
 
 
 
 
 
 
 
 
 
170
  def _build_local_text_encoder_conf() -> dict:
171
  text_encoder_name = get_env_var("TEXT_ENCODER", DEFAULT_TEXT_ENCODER)
172
  if text_encoder_name not in TEXT_ENCODER_PRESETS:
@@ -187,23 +196,33 @@ def _select_text_encoder_conf(text_encoder_url: str) -> dict:
187
  # - "auto": try API first, fallback to local if unreachable
188
  mode = get_env_var("TEXT_ENCODER_MODE", "auto").lower()
189
  autostart_enabled = _env_bool("TEXT_ENCODER_AUTOSTART", True)
 
190
  if mode == "local":
191
  return _build_local_text_encoder_conf()
192
  if mode == "api":
193
- if autostart_enabled:
194
- _ensure_text_encoder_server(text_encoder_url)
195
- api_conf = _build_api_text_encoder_conf(text_encoder_url)
196
- text_encoder = instantiate_from_dict(api_conf)
197
- text_encoder(["healthcheck"])
198
- return api_conf
 
 
 
 
 
 
 
 
 
 
 
 
 
199
 
200
  api_conf = _build_api_text_encoder_conf(text_encoder_url)
201
  try:
202
- if autostart_enabled:
203
- _ensure_text_encoder_server(text_encoder_url)
204
- text_encoder = instantiate_from_dict(api_conf)
205
- # Probe availability early so inference doesn't fail later.
206
- text_encoder(["healthcheck"])
207
  return api_conf
208
  except Exception as error:
209
  print(
 
167
  }
168
 
169
 
170
+ def _probe_api_text_encoder(text_encoder_url: str, autostart_enabled: bool) -> None:
171
+ """Instantiate and probe a text encoder API endpoint, raising on failure."""
172
+ if autostart_enabled:
173
+ _ensure_text_encoder_server(text_encoder_url)
174
+ api_conf = _build_api_text_encoder_conf(text_encoder_url)
175
+ text_encoder = instantiate_from_dict(api_conf)
176
+ text_encoder(["healthcheck"])
177
+
178
+
179
  def _build_local_text_encoder_conf() -> dict:
180
  text_encoder_name = get_env_var("TEXT_ENCODER", DEFAULT_TEXT_ENCODER)
181
  if text_encoder_name not in TEXT_ENCODER_PRESETS:
 
196
  # - "auto": try API first, fallback to local if unreachable
197
  mode = get_env_var("TEXT_ENCODER_MODE", "auto").lower()
198
  autostart_enabled = _env_bool("TEXT_ENCODER_AUTOSTART", True)
199
+ local_api_url = get_env_var("TEXT_ENCODER_LOCAL_URL", DEFAULT_TEXT_ENCODER_URL)
200
  if mode == "local":
201
  return _build_local_text_encoder_conf()
202
  if mode == "api":
203
+ try:
204
+ _probe_api_text_encoder(text_encoder_url, autostart_enabled)
205
+ return _build_api_text_encoder_conf(text_encoder_url)
206
+ except Exception as error:
207
+ # In native/direct runtimes a local encoder process may be running while
208
+ # TEXT_ENCODER_URL points to a remote service. Prefer local API fallback.
209
+ if (
210
+ not _is_local_text_encoder_url(text_encoder_url)
211
+ and local_api_url
212
+ and _is_local_text_encoder_url(local_api_url)
213
+ and _is_port_open(local_api_url)
214
+ ):
215
+ print(
216
+ "Configured remote text encoder is unreachable; retrying against local "
217
+ f"encoder URL {local_api_url}. ({type(error).__name__}: {error})"
218
+ )
219
+ _probe_api_text_encoder(local_api_url, autostart_enabled=False)
220
+ return _build_api_text_encoder_conf(local_api_url)
221
+ raise
222
 
223
  api_conf = _build_api_text_encoder_conf(text_encoder_url)
224
  try:
225
+ _probe_api_text_encoder(text_encoder_url, autostart_enabled)
 
 
 
 
226
  return api_conf
227
  except Exception as error:
228
  print(