LazyHuman10 commited on
Commit
1eea13b
·
1 Parent(s): 1f637de

fix: fill missing NPC keys with defaults instead of failing validation

Browse files
Files changed (1) hide show
  1. model_engine.py +23 -9
model_engine.py CHANGED
@@ -177,23 +177,37 @@ def parse_json_safe(text: str) -> dict:
177
 
178
 
179
  def _validate_npc_payload(payload: dict) -> dict:
180
- """Validate the NPC payload shape required by the UI."""
181
- missing = REQUIRED_NPC_KEYS - payload.keys()
182
- if missing:
183
- raise ValueError(f"NPC payload missing keys: {sorted(missing)}")
 
 
184
 
185
  stats = payload.get("stats")
186
  if not isinstance(stats, dict):
187
- raise ValueError("NPC stats must be a dictionary.")
 
 
188
 
189
- missing_stats = REQUIRED_STAT_KEYS - stats.keys()
190
- if missing_stats:
191
- raise ValueError(f"NPC stats missing keys: {sorted(missing_stats)}")
 
 
192
 
193
- payload["level"] = int(payload["level"])
194
  for key in REQUIRED_STAT_KEYS:
195
  stats[key] = max(1, min(100, int(stats[key])))
196
 
 
 
 
 
 
 
 
 
197
  return payload
198
 
199
 
 
177
 
178
 
179
  def _validate_npc_payload(payload: dict) -> dict:
180
+ """Validate the NPC payload shape, filling in missing keys from DEFAULT_NPC."""
181
+ # Fill any missing top-level keys with defaults so a partial response still works
182
+ for key in REQUIRED_NPC_KEYS:
183
+ if key not in payload:
184
+ print(f"[NPCverse] NPC payload missing key '{key}', using default.")
185
+ payload[key] = DEFAULT_NPC[key]
186
 
187
  stats = payload.get("stats")
188
  if not isinstance(stats, dict):
189
+ print("[NPCverse] NPC stats invalid, using defaults.")
190
+ payload["stats"] = dict(DEFAULT_NPC["stats"])
191
+ stats = payload["stats"]
192
 
193
+ # Fill any missing stat keys with defaults
194
+ for key in REQUIRED_STAT_KEYS:
195
+ if key not in stats:
196
+ print(f"[NPCverse] NPC stat '{key}' missing, using default.")
197
+ stats[key] = DEFAULT_NPC["stats"][key]
198
 
199
+ payload["level"] = int(payload.get("level") or DEFAULT_NPC["level"])
200
  for key in REQUIRED_STAT_KEYS:
201
  stats[key] = max(1, min(100, int(stats[key])))
202
 
203
+ # Ensure quests is a list of dicts
204
+ if not isinstance(payload.get("quests"), list) or len(payload["quests"]) == 0:
205
+ payload["quests"] = DEFAULT_NPC["quests"]
206
+
207
+ # Ensure secrets is a list of strings
208
+ if not isinstance(payload.get("secrets"), list) or len(payload["secrets"]) == 0:
209
+ payload["secrets"] = DEFAULT_NPC["secrets"]
210
+
211
  return payload
212
 
213