Extend CV classifier contract and provenance UI
This commit is contained in:
@@ -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));
|
||||
|
||||
@@ -13,7 +13,9 @@ public sealed record CvBlockClassificationResult(
|
||||
string? Location,
|
||||
string? Start,
|
||||
string? End,
|
||||
List<string>? Bullets);
|
||||
List<string>? Bullets,
|
||||
List<string>? Summary,
|
||||
List<string>? Skills);
|
||||
|
||||
public interface ICvAiClassifier
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user