Block C: Prompt-Umlaute korrigiert + Timeout parametrisiert
- ENHANCE_PROMPT_ADHOC und ENHANCE_PROMPT_RESEARCH: Umschreibungen durch echte Umlaute ersetzt (fuer -> fuer, praezises -> praezises, ...). Behebt den Widerspruch, dass der Prompt "echte Umlaute verwenden" forderte, die Anweisung selbst aber ae/oe/ue/ss nutzte. - call_claude() bekommt neuen timeout-Parameter. None = Fallback auf CLAUDE_TIMEOUT (1800s), sonst Override in Sekunden. asyncio.wait_for und die cancel-aware Variante nutzen durchgaengig den effective_timeout. - Enhance-Endpoint ruft call_claude mit timeout=60 auf (Haiku-Single-Shot, vorher global 1800s). - chat.py _call_claude_chat: Timeout von 60s auf 120s erhoeht (Chat-Antworten koennen etwas laenger dauern, haben aber keinen Anspruch auf 30 Min).
Dieser Commit ist enthalten in:
@@ -77,7 +77,7 @@ def _sanitize_mdash(text: str) -> str:
|
||||
"""Ersetzt Gedankenstriche durch Bindestriche (KI-Indikator reduzieren)."""
|
||||
return text.replace("\u2014", " - ").replace("\u2013", " - ")
|
||||
|
||||
async def call_claude(prompt: str, tools: str | None = "WebSearch,WebFetch", model: str | None = None, raw_text: bool = False) -> tuple[str, ClaudeUsage]:
|
||||
async def call_claude(prompt: str, tools: str | None = "WebSearch,WebFetch", model: str | None = None, raw_text: bool = False, timeout: float | None = None) -> tuple[str, ClaudeUsage]:
|
||||
"""Ruft Claude CLI auf. Gibt (result_text, usage) zurück.
|
||||
|
||||
Prompt wird via stdin uebergeben um OS ARG_MAX Limits zu vermeiden.
|
||||
@@ -86,8 +86,10 @@ async def call_claude(prompt: str, tools: str | None = "WebSearch,WebFetch", mod
|
||||
prompt: Der Prompt fuer Claude
|
||||
tools: Kommagetrennte erlaubte Tools (None = keine Tools, --max-turns 1)
|
||||
model: Optionales Modell (z.B. CLAUDE_MODEL_FAST fuer Haiku). None = CLAUDE_MODEL_STANDARD (Opus 4.7).
|
||||
timeout: Override in Sekunden. None = Fallback auf globalen CLAUDE_TIMEOUT (1800s).
|
||||
"""
|
||||
effective_model = model or CLAUDE_MODEL_STANDARD
|
||||
effective_timeout = timeout if timeout is not None else CLAUDE_TIMEOUT
|
||||
cmd = [CLAUDE_PATH, "-p", "-", "--output-format", "json", "--model", effective_model]
|
||||
if tools:
|
||||
cmd.extend(["--allowedTools", tools])
|
||||
@@ -118,7 +120,7 @@ async def call_claude(prompt: str, tools: str | None = "WebSearch,WebFetch", mod
|
||||
process.communicate(input=prompt.encode("utf-8"))
|
||||
)
|
||||
cancel_wait_task = asyncio.create_task(cancel_event.wait())
|
||||
timeout_task = asyncio.create_task(asyncio.sleep(CLAUDE_TIMEOUT))
|
||||
timeout_task = asyncio.create_task(asyncio.sleep(effective_timeout))
|
||||
|
||||
done, pending = await asyncio.wait(
|
||||
[communicate_task, cancel_wait_task, timeout_task],
|
||||
@@ -137,14 +139,14 @@ async def call_claude(prompt: str, tools: str | None = "WebSearch,WebFetch", mod
|
||||
else:
|
||||
process.kill()
|
||||
await process.wait()
|
||||
raise TimeoutError(f"Claude CLI Timeout nach {CLAUDE_TIMEOUT}s")
|
||||
raise TimeoutError(f"Claude CLI Timeout nach {effective_timeout}s")
|
||||
else:
|
||||
stdout, stderr = await asyncio.wait_for(
|
||||
process.communicate(input=prompt.encode("utf-8")), timeout=CLAUDE_TIMEOUT
|
||||
process.communicate(input=prompt.encode("utf-8")), timeout=effective_timeout
|
||||
)
|
||||
except asyncio.TimeoutError:
|
||||
process.kill()
|
||||
raise TimeoutError(f"Claude CLI Timeout nach {CLAUDE_TIMEOUT}s")
|
||||
raise TimeoutError(f"Claude CLI Timeout nach {effective_timeout}s")
|
||||
|
||||
if process.returncode != 0:
|
||||
error_msg = stderr.decode("utf-8", errors="replace").strip()
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren