Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
55 lines
1.9 KiB
Python
55 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
import hashlib
|
|
|
|
from app.agents.schemas.learning import PatternCandidate, SkillCandidate
|
|
|
|
|
|
class SkillCandidateBuilder:
|
|
def build(self, patterns: list[PatternCandidate]) -> list[SkillCandidate]:
|
|
candidates: list[SkillCandidate] = []
|
|
|
|
for pattern in patterns:
|
|
if pattern.confidence < 0.55:
|
|
continue
|
|
|
|
name = self._build_name(pattern)
|
|
candidates.append(
|
|
SkillCandidate(
|
|
candidate_id=f"candidate-{self._stable_suffix(pattern)}",
|
|
name=name,
|
|
summary=pattern.description,
|
|
candidate_type=self._map_candidate_type(pattern.pattern_type),
|
|
source_pattern_ids=[pattern.pattern_id],
|
|
confidence=pattern.confidence,
|
|
evidence_refs=pattern.evidence_refs[:4],
|
|
recommended_status="candidate",
|
|
)
|
|
)
|
|
|
|
return candidates
|
|
|
|
@staticmethod
|
|
def _build_name(pattern: PatternCandidate) -> str:
|
|
prefix = {
|
|
"workflow": "workflow",
|
|
"decomposition": "decomposition",
|
|
"preference": "preference",
|
|
}.get(pattern.pattern_type, "learned")
|
|
stable_suffix = SkillCandidateBuilder._stable_suffix(pattern)
|
|
return f"{prefix}-{stable_suffix}"
|
|
|
|
@staticmethod
|
|
def _map_candidate_type(pattern_type: str) -> str:
|
|
mapping = {
|
|
"workflow": "workflow_skill",
|
|
"decomposition": "decomposition_skill",
|
|
"preference": "preference_skill",
|
|
}
|
|
return mapping.get(pattern_type, "workflow_skill")
|
|
|
|
@staticmethod
|
|
def _stable_suffix(pattern: PatternCandidate) -> str:
|
|
raw = f"{pattern.pattern_type}:{pattern.description}".encode("utf-8")
|
|
return hashlib.sha1(raw).hexdigest()[:10]
|