feat: improve resume optimization and import reliability

This commit is contained in:
hyp
2026-08-10 11:26:47 +08:00
parent 1c762fd092
commit d8db0d8792
35 changed files with 1861 additions and 661 deletions
+56 -16
View File
@@ -5,6 +5,7 @@ from __future__ import annotations
from copy import deepcopy
from typing import Any, Callable
from .database import SessionRevisionConflict
from .fsm import FSMError
from .llm_services import log_ai_event
from .models import ActionResponse, OptimizeEntryRequest, OptimizeRequest, ResumePatchRequest
@@ -59,26 +60,46 @@ class ResumeEditingMixin:
return self._action_response(session, None)
def generate_profile_summary(self, session_id: str) -> ActionResponse:
with self.database.transaction(immediate=True) as connection:
with self.database.transaction() as connection:
session = self._session_or_404(connection, session_id)
resume = self._resume_or_409(connection, session_id)
try:
summary_text = self.profile_summary_generator.generate(resume["content"])
except Exception as exc:
log_ai_event(
"profile_summary_regeneration_failed",
reason_code=getattr(exc, "reason_code", type(exc).__name__),
exception=type(exc).__name__,
)
raise FSMError(
"profile_summary_generation_failed",
"\u4e2a\u4eba\u4ecb\u7ecd\u751f\u6210\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5",
status_code=503,
) from exc
with self.database.transaction(immediate=True) as connection:
current_resume = self.database.fetch_resume(connection, session_id, for_update=True)
if current_resume is None:
raise FSMError("resume_not_created", "Create the resume before editing it")
if current_resume["revision"] != resume["revision"]:
raise FSMError(
"revision_conflict",
"Resume changed while generation was running; retry with the latest version",
status_code=409,
)
try:
summary_text = self.profile_summary_generator.generate(resume["content"])
content = set_profile_summary_proposal(resume["content"], summary_text)
content = set_profile_summary_proposal(current_resume["content"], summary_text)
except DocumentError as exc:
raise _to_fsm(exc) from exc
except Exception as exc:
log_ai_event(
"profile_summary_regeneration_failed",
reason_code=getattr(exc, "reason_code", type(exc).__name__),
exception=type(exc).__name__,
try:
self.database.update_resume(
connection, session_id, content, expected_revision=resume["revision"]
)
except SessionRevisionConflict as exc:
raise FSMError(
"profile_summary_generation_failed",
"\u4e2a\u4eba\u4ecb\u7ecd\u751f\u6210\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5",
status_code=503,
"revision_conflict",
"Resume changed while generation was running; retry with the latest version",
status_code=409,
) from exc
self.database.update_resume(connection, session_id, content)
return self._action_response(session, None)
@@ -103,7 +124,7 @@ class ResumeEditingMixin:
return self._action_response(session, None)
def optimize_entry(self, session_id: str, request: OptimizeRequest) -> ActionResponse:
with self.database.transaction(immediate=True) as connection:
with self.database.transaction() as connection:
session = self._session_or_404(connection, session_id)
resume = self._resume_or_409(connection, session_id)
found = find_entry(resume["content"], request.entry_id)
@@ -117,10 +138,20 @@ class ResumeEditingMixin:
"instruction": request.instruction,
"entry_type": section.get("kind"),
}
proposal = self.expander.expand(deepcopy(entry), context=context)
proposal = self.expander.expand(deepcopy(entry), context=context)
with self.database.transaction(immediate=True) as connection:
current_resume = self.database.fetch_resume(connection, session_id, for_update=True)
if current_resume is None:
raise FSMError("resume_not_created", "Create the resume before editing it")
if current_resume["revision"] != resume["revision"]:
raise FSMError(
"revision_conflict",
"Resume changed while generation was running; retry with the latest version",
status_code=409,
)
try:
content = set_pending_proposal(
resume["content"],
current_resume["content"],
request.entry_id,
proposal.get("optimized_description") or "",
source=proposal.get("source", "ai_expanded"),
@@ -128,7 +159,16 @@ class ResumeEditingMixin:
)
except DocumentError as exc:
raise _to_fsm(exc) from exc
self.database.update_resume(connection, session_id, content)
try:
self.database.update_resume(
connection, session_id, content, expected_revision=resume["revision"]
)
except SessionRevisionConflict as exc:
raise FSMError(
"revision_conflict",
"Resume changed while generation was running; retry with the latest version",
status_code=409,
) from exc
return self._action_response(session, None)