20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
# File 'lib/legion/extensions/apollo/runners/expertise.rb', line 20
def aggregate(**)
return { success: false, error: 'apollo_data_not_available' } unless defined?(Legion::Data::Model::ApolloEntry)
entries = Legion::Data::Model::ApolloEntry
.select(:source_agent, :tags, :confidence)
.exclude(source_agent: nil)
.all
groups = {}
entries.each do |entry|
agent = entry.source_agent
domain = entry.tags.is_a?(Array) ? (entry.tags.first || 'general') : 'general'
key = "#{agent}:#{domain}"
groups[key] ||= { agent_id: agent, domain: domain, confidences: [] }
groups[key][:confidences] << entry.confidence.to_f
end
agent_set = Set.new
domain_set = Set.new
groups.each_value do |group|
avg = group[:confidences].sum / group[:confidences].size
count = group[:confidences].size
cap = Helpers::Confidence.apollo_setting(:expertise, :proficiency_cap, default: 1.0)
proficiency = [avg * Math.log2(count + 1), cap].min
existing = Legion::Data::Model::ApolloExpertise
.where(agent_id: group[:agent_id], domain: group[:domain]).first
if existing
existing.update(proficiency: proficiency, entry_count: count, last_active_at: Time.now)
else
Legion::Data::Model::ApolloExpertise.create(
agent_id: group[:agent_id], domain: group[:domain],
proficiency: proficiency, entry_count: count, last_active_at: Time.now
)
end
agent_set << group[:agent_id]
domain_set << group[:domain]
end
{ success: true, agents: agent_set.size, domains: domain_set.size }
rescue Sequel::Error => e
{ success: false, error: e.message }
end
|