refactor: improve PDF extraction, error handling, and proxy configuration

This commit is contained in:
2026-06-30 10:39:27 +08:00
parent 1ccac1f29a
commit a2e3dc398b
7 changed files with 438 additions and 71 deletions
+10 -7
View File
@@ -41,7 +41,8 @@ async def call_claude(
fix_errors: 上一轮验证错误列表(用于重试)
"""
if session_id is None:
session_id = f"claude-summary-{uuid.uuid4().hex[:8]}"
# claude CLI 的 --session-id 要求合法 UUID;非 UUID 会被拒绝(Invalid session ID
session_id = str(uuid.uuid4())
cmd = [settings.CLAUDE_BIN, "-p", "--output-format", "text"]
@@ -51,22 +52,22 @@ async def call_claude(
else:
cmd += ["--session-id", session_id]
cmd.append(prompt)
logger.info(
"Calling claude (session=%s, fix=%s)",
session_id,
bool(fix_errors),
)
# prompt 走 stdin,避免长文本(论文 PDF 动辄数十 KB)超出系统 ARG_MAX
proc = await asyncio.create_subprocess_exec(
*cmd,
stdin=asyncio.subprocess.PIPE,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
try:
stdout, stderr = await asyncio.wait_for(
proc.communicate(),
proc.communicate(input=prompt.encode("utf-8")),
timeout=settings.SUMMARY_TIMEOUT_SECONDS,
)
except asyncio.TimeoutError:
@@ -77,8 +78,10 @@ async def call_claude(
)
if proc.returncode != 0:
raise ClaudeProcessError(
proc.returncode, stderr.decode("utf-8", errors="replace")
)
# claude CLI 把 API 错误输出到 stdout(stderr 常为空),优先用有内容的
detail = stderr.decode("utf-8", errors="replace")
if not detail.strip():
detail = stdout.decode("utf-8", errors="replace")
raise ClaudeProcessError(proc.returncode, detail)
return stdout.decode("utf-8", errors="replace"), session_id