refactor: improve PDF extraction, error handling, and proxy configuration
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user