@@ -286,6 +286,10 @@ def build_saved_workflow_snapshot_from_data(payload: dict):
286286 )
287287
288288
289+ def _as_dict (payload ):
290+ return payload if isinstance (payload , dict ) else {}
291+
292+
289293def _build_imported_job_posting (payload ):
290294 if not isinstance (payload , dict ):
291295 return None
@@ -309,6 +313,7 @@ def _build_imported_job_posting(payload):
309313
310314
311315def _build_candidate_profile (payload : dict ):
316+ payload = _as_dict (payload )
312317 return CandidateProfile (
313318 full_name = str (payload .get ("full_name" , "" ) or "" ),
314319 location = str (payload .get ("location" , "" ) or "" ),
@@ -324,6 +329,7 @@ def _build_candidate_profile(payload: dict):
324329
325330
326331def _build_work_experience (payload : dict ):
332+ payload = _as_dict (payload )
327333 return WorkExperience (
328334 title = str (payload .get ("title" , "" ) or "" ),
329335 organization = str (payload .get ("organization" , "" ) or "" ),
@@ -335,6 +341,7 @@ def _build_work_experience(payload: dict):
335341
336342
337343def _build_education_entry (payload : dict ):
344+ payload = _as_dict (payload )
338345 return EducationEntry (
339346 institution = str (payload .get ("institution" , "" ) or "" ),
340347 degree = str (payload .get ("degree" , "" ) or "" ),
@@ -345,7 +352,9 @@ def _build_education_entry(payload: dict):
345352
346353
347354def _build_job_description (payload : dict ):
355+ payload = _as_dict (payload )
348356 requirements = payload .get ("requirements" ) or {}
357+ requirements = _as_dict (requirements )
349358 return JobDescription (
350359 title = str (payload .get ("title" , "" ) or "" ),
351360 raw_text = str (payload .get ("raw_text" , "" ) or "" ),
@@ -362,6 +371,7 @@ def _build_job_description(payload: dict):
362371
363372
364373def _build_fit_analysis (payload : dict ):
374+ payload = _as_dict (payload )
365375 return FitAnalysis (
366376 target_role = str (payload .get ("target_role" , "" ) or "" ),
367377 overall_score = int (payload .get ("overall_score" , 0 ) or 0 ),
@@ -378,6 +388,7 @@ def _build_fit_analysis(payload: dict):
378388
379389
380390def _build_tailored_draft (payload : dict ):
391+ payload = _as_dict (payload )
381392 return TailoredResumeDraft (
382393 target_role = str (payload .get ("target_role" , "" ) or "" ),
383394 professional_summary = str (payload .get ("professional_summary" , "" ) or "" ),
@@ -388,6 +399,7 @@ def _build_tailored_draft(payload: dict):
388399
389400
390401def _build_profile_output (payload : dict ):
402+ payload = _as_dict (payload )
391403 return ProfileAgentOutput (
392404 positioning_headline = str (payload .get ("positioning_headline" , "" ) or "" ),
393405 evidence_highlights = [str (item ) for item in payload .get ("evidence_highlights" , []) or []],
@@ -397,6 +409,7 @@ def _build_profile_output(payload: dict):
397409
398410
399411def _build_job_output (payload : dict ):
412+ payload = _as_dict (payload )
400413 return JobAgentOutput (
401414 requirement_summary = str (payload .get ("requirement_summary" , "" ) or "" ),
402415 priority_skills = [str (item ) for item in payload .get ("priority_skills" , []) or []],
@@ -406,6 +419,7 @@ def _build_job_output(payload: dict):
406419
407420
408421def _build_fit_output (payload : dict ):
422+ payload = _as_dict (payload )
409423 return FitAgentOutput (
410424 fit_summary = str (payload .get ("fit_summary" , "" ) or "" ),
411425 top_matches = [str (item ) for item in payload .get ("top_matches" , []) or []],
@@ -414,6 +428,7 @@ def _build_fit_output(payload: dict):
414428
415429
416430def _build_tailoring_output (payload : dict ):
431+ payload = _as_dict (payload )
417432 return TailoringAgentOutput (
418433 professional_summary = str (payload .get ("professional_summary" , "" ) or "" ),
419434 rewritten_bullets = [str (item ) for item in payload .get ("rewritten_bullets" , []) or []],
@@ -425,6 +440,7 @@ def _build_tailoring_output(payload: dict):
425440def _build_strategy_output (payload ):
426441 if not payload :
427442 return None
443+ payload = _as_dict (payload )
428444 return StrategyAgentOutput (
429445 recruiter_positioning = str (payload .get ("recruiter_positioning" , "" ) or "" ),
430446 cover_letter_talking_points = [str (item ) for item in payload .get ("cover_letter_talking_points" , []) or []],
@@ -433,6 +449,7 @@ def _build_strategy_output(payload):
433449
434450
435451def _build_review_output (payload : dict ):
452+ payload = _as_dict (payload )
436453 return ReviewAgentOutput (
437454 approved = bool (payload .get ("approved" , False )),
438455 grounding_issues = [str (item ) for item in payload .get ("grounding_issues" , []) or []],
@@ -447,6 +464,7 @@ def _build_review_output(payload: dict):
447464def _build_resume_generation_output (payload ):
448465 if not payload :
449466 return None
467+ payload = _as_dict (payload )
450468 return ResumeGenerationAgentOutput (
451469 professional_summary = str (payload .get ("professional_summary" , "" ) or "" ),
452470 highlighted_skills = [str (item ) for item in payload .get ("highlighted_skills" , []) or []],
@@ -459,6 +477,7 @@ def _build_resume_generation_output(payload):
459477def _build_cover_letter_output (payload ):
460478 if not payload :
461479 return None
480+ payload = _as_dict (payload )
462481 return CoverLetterAgentOutput (
463482 greeting = str (payload .get ("greeting" , "" ) or "" ),
464483 opening_paragraph = str (payload .get ("opening_paragraph" , "" ) or "" ),
@@ -470,6 +489,7 @@ def _build_cover_letter_output(payload):
470489
471490
472491def _build_review_pass_result (payload : dict ):
492+ payload = _as_dict (payload )
473493 return ReviewPassResult (
474494 pass_index = int (payload .get ("pass_index" , 0 ) or 0 ),
475495 tailoring = _build_tailoring_output (payload .get ("tailoring" ) or {}),
@@ -481,6 +501,7 @@ def _build_review_pass_result(payload: dict):
481501def _build_agent_result (payload ):
482502 if not payload :
483503 return None
504+ payload = _as_dict (payload )
484505 return AgentWorkflowResult (
485506 mode = str (payload .get ("mode" , "" ) or "" ),
486507 model = str (payload .get ("model" , "" ) or "" ),
0 commit comments