generated from kgod/ai-review-template
feat: improve resume optimization and import reliability
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user