Skip to content

Commit 640e1f2

Browse files
committed
fix: normalize claw target length parsing
1 parent b7412bb commit 640e1f2

1 file changed

Lines changed: 35 additions & 1 deletion

File tree

apps/novelclaw/workflow/executor.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,37 @@ def _set_language(self, lang: str):
119119
def _is_en(self) -> bool:
120120
return str(getattr(self, "lang", "en")).lower().startswith("en")
121121

122+
def _normalize_target_length(self, target_length: Any, default: int = 5000) -> int:
123+
"""Normalize free-form target-length input into a safe integer."""
124+
if isinstance(target_length, (int, float)):
125+
return max(1, int(target_length))
126+
127+
raw = str(target_length or "").strip()
128+
if not raw:
129+
return default
130+
131+
try:
132+
return max(1, int(raw))
133+
except Exception:
134+
pass
135+
136+
digit_match = re.search(r"(\d{3,7})", raw)
137+
if digit_match:
138+
try:
139+
return max(1, int(digit_match.group(1)))
140+
except Exception:
141+
pass
142+
143+
lower = raw.lower()
144+
if any(token in raw for token in ["长篇", "长文", "超长"]) or "long-form" in lower or "epic" in lower:
145+
return 20000
146+
if any(token in raw for token in ["中篇", "中长"]) or "medium" in lower:
147+
return 10000
148+
if any(token in raw for token in ["短篇", "短文"]) or "short" in lower:
149+
return 3000
150+
151+
return default
152+
122153
def _prompt(self, zh: str, en: str) -> str:
123154
"""Return prompt text based on current language selection."""
124155
return en if self._is_en() else zh
@@ -371,6 +402,7 @@ def generate_long_text(
371402
print(self._prompt(f" - 类型: {genre}", f" - Genre: {genre}"))
372403
print(self._prompt(f" - 风格: {', '.join(style_tags)}", f" - Style: {', '.join(style_tags)}"))
373404
print(self._prompt(f" - 主题: {topic}", f" - Topic: {topic}"))
405+
target_length = self._normalize_target_length(target_length, default=5000)
374406
print(self._prompt(f" - 目标长度: {target_length}字", f" - Target length: {target_length} words"))
375407
else:
376408
# 如果没有自动分析,使用默认值
@@ -385,6 +417,8 @@ def generate_long_text(
385417
if not style_tags:
386418
style_tags = ["delicate"] if self._is_en() else ["细腻"]
387419

420+
target_length = self._normalize_target_length(target_length, default=5000)
421+
388422
self._remember_project_claw_context(
389423
idea=idea,
390424
topic=topic,
@@ -400,7 +434,7 @@ def generate_long_text(
400434

401435
# 2. 任务分析 / Claw 自举
402436
if self._claw_mode():
403-
complexity = "high" if int(target_length or 0) >= 20000 else ("medium" if int(target_length or 0) >= 8000 else "focused")
437+
complexity = "high" if target_length >= 20000 else ("medium" if target_length >= 8000 else "focused")
404438
task_analysis = {
405439
"complexity": complexity,
406440
"target_length": target_length,

0 commit comments

Comments
 (0)