Extend CV classifier contract and provenance UI

This commit is contained in:
2026-04-01 11:06:55 +02:00
parent b283f8b9d2
commit f402213526
7 changed files with 49 additions and 17 deletions
@@ -934,14 +934,18 @@ public sealed class ProfileCvController : ControllerBase
switch (block.SectionName)
{
case "Professional Summary":
foreach (var item in SplitClassifierContent(block.Content, 5))
foreach (var item in (block.Classification?.Summary is { Count: > 0 }
? block.Classification.Summary
: SplitClassifierContent(block.Content, 5)))
{
summary.Add(item);
}
ApplyClassifierFieldMetadata(profile, "summary", summary.FirstOrDefault(), block, now);
break;
case "Skills":
foreach (var item in SplitClassifierSkills(block.Content))
foreach (var item in (block.Classification?.Skills is { Count: > 0 }
? block.Classification.Skills.Where(skill => !string.IsNullOrWhiteSpace(skill)).Select(skill => skill.Trim())
: SplitClassifierSkills(block.Content)))
{
skills.Add(item);
}
@@ -1013,7 +1017,9 @@ public sealed class ProfileCvController : ControllerBase
End = NullIfWhitespace(classification.End),
IsCurrent = string.Equals(classification.End, "Present", StringComparison.OrdinalIgnoreCase) || string.Equals(classification.End, "Current", StringComparison.OrdinalIgnoreCase),
Bullets = bullets,
Skills = SplitClassifierSkills(block.OriginalBlock)
Skills = classification.Skills is { Count: > 0 }
? classification.Skills.Where(skill => !string.IsNullOrWhiteSpace(skill)).Select(skill => skill.Trim()).ToList()
: SplitClassifierSkills(block.OriginalBlock)
};
return StructuredCvProfileJson.Normalize(new StructuredCvProfile { Jobs = new List<StructuredCvJob> { job } }).Jobs.FirstOrDefault();
@@ -1140,12 +1146,20 @@ public sealed class ProfileCvController : ControllerBase
}
else if (string.Equals(sectionName, "Skills", StringComparison.OrdinalIgnoreCase))
{
var items = SplitClassifierSkills(block);
var items = classification?.Skills is { Count: > 0 }
? classification.Skills.Where(skill => !string.IsNullOrWhiteSpace(skill)).Select(skill => skill.Trim()).ToList()
: SplitClassifierSkills(block);
if (items.Count > 0) content = string.Join("\n", items);
}
else if (string.Equals(sectionName, "Professional Summary", StringComparison.OrdinalIgnoreCase) && classification?.Bullets is { Count: > 0 })
else if (string.Equals(sectionName, "Professional Summary", StringComparison.OrdinalIgnoreCase))
{
content = string.Join("\n", classification.Bullets.Where(bullet => !string.IsNullOrWhiteSpace(bullet)).Select(bullet => $"- {bullet.Trim()}"));
var items = classification?.Summary is { Count: > 0 }
? classification.Summary.Where(line => !string.IsNullOrWhiteSpace(line)).Select(line => $"- {line.Trim()}")
: classification?.Bullets is { Count: > 0 }
? classification.Bullets.Where(bullet => !string.IsNullOrWhiteSpace(bullet)).Select(bullet => $"- {bullet.Trim()}")
: Enumerable.Empty<string>();
var materialized = items.ToList();
if (materialized.Count > 0) content = string.Join("\n", materialized);
}
results.Add(new ClassifiedCvBlock(index + 1, block, sectionName, content, classification));