Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 18 additions & 15 deletions src/applypilot/scoring/cover_letter.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,8 @@ def run_cover_letters(min_score: int = 7, limit: int = 20,
results: list[dict] = []
error_count = 0

saved = 0

for job in jobs:
completed += 1
try:
Expand Down Expand Up @@ -262,6 +264,17 @@ def run_cover_letters(min_score: int = 7, limit: int = 20,
}
results.append(result)

# Commit immediately -- if the process crashes or is interrupted,
# already-generated cover letters are safely persisted.
now = datetime.now(timezone.utc).isoformat()
conn.execute(
"UPDATE jobs SET cover_letter_path=?, cover_letter_at=?, "
"cover_attempts=COALESCE(cover_attempts,0)+1 WHERE url=?",
(result["path"], now, result["url"]),
)
conn.commit()
saved += 1

elapsed = time.time() - t0
rate = completed / elapsed if elapsed > 0 else 0
log.info(
Expand All @@ -275,25 +288,15 @@ def run_cover_letters(min_score: int = 7, limit: int = 20,
}
error_count += 1
results.append(result)
log.error("%d/%d [ERROR] %s -- %s", completed, len(jobs), job["title"][:40], e)

# Persist to DB: increment attempt counter for ALL, save path only for successes
now = datetime.now(timezone.utc).isoformat()
saved = 0
for r in results:
if r.get("path"):
conn.execute(
"UPDATE jobs SET cover_letter_path=?, cover_letter_at=?, "
"cover_attempts=COALESCE(cover_attempts,0)+1 WHERE url=?",
(r["path"], now, r["url"]),
)
saved += 1
else:
now = datetime.now(timezone.utc).isoformat()
conn.execute(
"UPDATE jobs SET cover_attempts=COALESCE(cover_attempts,0)+1 WHERE url=?",
(r["url"],),
(job["url"],),
)
conn.commit()
conn.commit()

log.error("%d/%d [ERROR] %s -- %s", completed, len(jobs), job["title"][:40], e)

elapsed = time.time() - t0
log.info("Cover letters done in %.1fs: %d generated, %d errors", elapsed, saved, error_count)
Expand Down
18 changes: 9 additions & 9 deletions src/applypilot/scoring/scorer.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,20 +147,20 @@ def run_scoring(limit: int = 0, rescore: bool = False) -> dict:

results.append(result)

# Commit immediately -- if the process crashes or is interrupted,
# already-scored jobs are safely persisted and won't be re-scored.
now = datetime.now(timezone.utc).isoformat()
conn.execute(
"UPDATE jobs SET fit_score = ?, score_reasoning = ?, scored_at = ? WHERE url = ?",
(result["score"], f"{result['keywords']}\n{result['reasoning']}", now, result["url"]),
)
conn.commit()

log.info(
"[%d/%d] score=%d %s",
completed, len(jobs), result["score"], job.get("title", "?")[:60],
)

# Write scores to DB
now = datetime.now(timezone.utc).isoformat()
for r in results:
conn.execute(
"UPDATE jobs SET fit_score = ?, score_reasoning = ?, scored_at = ? WHERE url = ?",
(r["score"], f"{r['keywords']}\n{r['reasoning']}", now, r["url"]),
)
conn.commit()

elapsed = time.time() - t0
log.info("Done: %d scored in %.1fs (%.1f jobs/sec)", len(results), elapsed, len(results) / elapsed if elapsed > 0 else 0)

Expand Down
34 changes: 17 additions & 17 deletions src/applypilot/scoring/tailor.py
Original file line number Diff line number Diff line change
Expand Up @@ -544,6 +544,23 @@ def run_tailoring(min_score: int = 7, limit: int = 20,
results.append(result)
stats[result.get("status", "error")] = stats.get(result.get("status", "error"), 0) + 1

# Commit immediately -- if the process crashes or is interrupted,
# already-tailored jobs are safely persisted and won't be redone.
now = datetime.now(timezone.utc).isoformat()
_success_statuses = {"approved", "approved_with_judge_warning"}
if result["status"] in _success_statuses:
conn.execute(
"UPDATE jobs SET tailored_resume_path=?, tailored_at=?, "
"tailor_attempts=COALESCE(tailor_attempts,0)+1 WHERE url=?",
(result["path"], now, result["url"]),
)
else:
conn.execute(
"UPDATE jobs SET tailor_attempts=COALESCE(tailor_attempts,0)+1 WHERE url=?",
(result["url"],),
)
conn.commit()

elapsed = time.time() - t0
rate = completed / elapsed if elapsed > 0 else 0
log.info(
Expand All @@ -555,23 +572,6 @@ def run_tailoring(min_score: int = 7, limit: int = 20,
result["title"][:40],
)

# Persist to DB: increment attempt counter for ALL, save path only for approved
now = datetime.now(timezone.utc).isoformat()
_success_statuses = {"approved", "approved_with_judge_warning"}
for r in results:
if r["status"] in _success_statuses:
conn.execute(
"UPDATE jobs SET tailored_resume_path=?, tailored_at=?, "
"tailor_attempts=COALESCE(tailor_attempts,0)+1 WHERE url=?",
(r["path"], now, r["url"]),
)
else:
conn.execute(
"UPDATE jobs SET tailor_attempts=COALESCE(tailor_attempts,0)+1 WHERE url=?",
(r["url"],),
)
conn.commit()

elapsed = time.time() - t0
log.info(
"Tailoring done in %.1fs: %d approved, %d failed_validation, %d failed_judge, %d errors",
Expand Down