Class: Observ::ModerationGuardrailJob

Inherits:
ApplicationJob
  • Object
show all
Defined in:
app/jobs/observ/moderation_guardrail_job.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.enqueue_for_agent_types(agent_types, since: 1.hour.ago) ⇒ Object

Enqueue moderation for specific agent types

Parameters:

  • agent_types (Array<String>)

    Agent types to moderate

  • since (Time) (defaults to: 1.hour.ago)

    Only process sessions created after this time



63
64
65
66
67
68
69
70
# File 'app/jobs/observ/moderation_guardrail_job.rb', line 63

def self.enqueue_for_agent_types(agent_types, since: 1.hour.ago)
  Observ::Session
    .where(created_at: since..)
    .where("metadata->>'agent_type' IN (?)", agent_types)
    .find_each do |session|
      perform_later(session_id: session.id)
    end
end

.enqueue_for_scope(scope, sample_percentage: 100) ⇒ Object

Class method to enqueue moderation for traces matching criteria

Parameters:

  • scope (ActiveRecord::Relation)

    Scope of traces to moderate

  • sample_percentage (Integer) (defaults to: 100)

    Percentage of traces to sample (1-100)



33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'app/jobs/observ/moderation_guardrail_job.rb', line 33

def self.enqueue_for_scope(scope, sample_percentage: 100)
  traces = scope.left_joins(:review_item)
                .where(observ_review_items: { id: nil })

  if sample_percentage < 100
    sample_size = (traces.count * sample_percentage / 100.0).ceil
    traces = traces.order("RANDOM()").limit(sample_size)
  end

  traces.find_each do |trace|
    perform_later(trace_id: trace.id)
  end
end

.enqueue_user_facing(since: 1.hour.ago) ⇒ Object

Enqueue moderation for user-facing sessions only

Parameters:

  • since (Time) (defaults to: 1.hour.ago)

    Only process sessions created after this time



50
51
52
53
54
55
56
57
# File 'app/jobs/observ/moderation_guardrail_job.rb', line 50

def self.enqueue_user_facing(since: 1.hour.ago)
  Observ::Session
    .where(created_at: since..)
    .where("metadata->>'user_facing' = ?", "true")
    .find_each do |session|
      perform_later(session_id: session.id)
    end
end

Instance Method Details

#perform(trace_id: nil, session_id: nil, **options) ⇒ Object

Process a single trace or session

Parameters:

  • trace_id (Integer) (defaults to: nil)

    ID of the trace to moderate

  • session_id (Integer) (defaults to: nil)

    ID of the session to moderate

  • options (Hash)

    Options for moderation

Options Hash (**options):

  • :moderate_input (Boolean)

    Whether to moderate input (default: true)

  • :moderate_output (Boolean)

    Whether to moderate output (default: true)

  • :aggregate (Boolean)

    Whether to moderate aggregated session content



19
20
21
22
23
24
25
26
27
# File 'app/jobs/observ/moderation_guardrail_job.rb', line 19

def perform(trace_id: nil, session_id: nil, **options)
  if trace_id
    moderate_trace(trace_id, options)
  elsif session_id
    moderate_session(session_id, options)
  else
    Rails.logger.warn "[ModerationGuardrailJob] No trace_id or session_id provided"
  end
end