Module: PromptCanary::Deployment

Included in:
PromptCanary
Defined in:
lib/prompt_canary/deployment.rb

Overview

rubocop:disable Metrics/ModuleLength

Instance Method Summary collapse

Instance Method Details

#demote(prompt_class, version_name, reason: nil, triggered_by: "manual", triggering_metric: nil, triggering_value: nil, triggering_threshold: nil) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/prompt_canary/deployment.rb', line 49

def demote(prompt_class, version_name, reason: nil, triggered_by: "manual",
           triggering_metric: nil, triggering_value: nil, triggering_threshold: nil)
  assert_can_demote_primary!(prompt_class, version_name)

  if ar_storage?
    require "prompt_canary/storage/active_record_adapter"
    prev_percent = effective_canary_percent(prompt_class, version_name)
    override = RolloutOverride.find_or_initialize_by(prompt: prompt_class.name, version: version_name)
    override.created_at ||= Time.now
    override.update!(rollout_override: 0)
    record_event(
      prompt: prompt_class.name, version: version_name, event: "demoted",
      previous_percent: prev_percent, new_percent: 0, new_status: "demoted",
      reason: reason, triggered_by: triggered_by,
      triggering_metric: triggering_metric&.to_s,
      triggering_value: triggering_value,
      triggering_threshold: triggering_threshold
    )
  else
    version = prompt_class.versions.find { |v| v.name == version_name }
    version&.demote!
  end
  publish("prompt_canary.demoted", prompt: prompt_class.name, version: version_name, reason: reason)
end

#promote(prompt_class, version_name, reason: nil) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/prompt_canary/deployment.rb', line 29

def promote(prompt_class, version_name, reason: nil)
  assert_version_registered!(prompt_class, version_name)

  if ar_storage?
    require "prompt_canary/storage/active_record_adapter"
    prev_primary = effective_primary_name(prompt_class)
    prev_status  = current_version_status(prompt_class, version_name)
    override = PrimaryOverride.find_or_initialize_by(prompt: prompt_class.name)
    override.created_at ||= Time.now
    override.update!(version: version_name)
    record_event(prompt: prompt_class.name, version: version_name, event: "promoted",
                 previous_status: prev_status, new_status: "primary",
                 reason: reason, triggered_by: "manual")
    record_superseded_event(prompt_class, prev_primary, version_name)
  else
    prompt_class.promote_to_primary!(version_name)
  end
  publish("prompt_canary.promoted", prompt: prompt_class.name, version: version_name, reason: reason)
end

#restore(prompt_class, version_name) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/prompt_canary/deployment.rb', line 74

def restore(prompt_class, version_name)
  if ar_storage?
    require "prompt_canary/storage/active_record_adapter"
    RolloutOverride.where(prompt: prompt_class.name, version: version_name).delete_all
    record_event(prompt: prompt_class.name, version: version_name, event: "restored",
                 previous_status: "demoted", new_status: "candidate", triggered_by: "manual")
  else
    version = prompt_class.versions.find { |v| v.name == version_name }
    version&.restore!
  end
  publish("prompt_canary.restored", prompt: prompt_class.name, version: version_name)
end

#set_canary(prompt_class, version_name, percent) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/prompt_canary/deployment.rb', line 6

def set_canary(prompt_class, version_name, percent)
  assert_valid_canary_percent!(percent)
  assert_version_registered!(prompt_class, version_name)

  if ar_storage?
    require "prompt_canary/storage/active_record_adapter"
    if RolloutOverride.where(prompt: prompt_class.name, version: version_name, rollout_override: 0).exists?
      raise DemotedVersionError,
            "#{version_name.inspect} is demoted — call restore before adjusting traffic"
    end

    prev_percent = effective_canary_percent(prompt_class, version_name)
    override = RolloutOverride.find_or_initialize_by(prompt: prompt_class.name, version: version_name)
    override.created_at ||= Time.now
    override.update!(rollout_override: percent)
    record_event(prompt: prompt_class.name, version: version_name, event: "canary_set",
                 previous_percent: prev_percent, new_percent: percent, triggered_by: "manual")
  else
    version = prompt_class.versions.find { |v| v.name == version_name }
    version.set_rollout!(percent)
  end
end