Class: Observ::Session

Inherits:
ApplicationRecord show all
Includes:
JsonQueryable, Reviewable, Scoreable
Defined in:
app/models/observ/session.rb

Instance Method Summary collapse

Methods included from Reviewable

#enqueue_for_review!, #in_review_queue?, #pending_review?, #review_status, #reviewed?

Methods included from Scoreable

#manual_score, #score_for, #score_summary, #scored?

Instance Method Details

#average_llm_latency_msObject



44
45
46
47
48
49
50
51
52
53
54
# File 'app/models/observ/session.rb', line 44

def average_llm_latency_ms
  generations = Observ::Generation.joins(trace: :observ_session)
                                  .where(observ_sessions: { id: id })
                                  .where.not(end_time: nil)
  return 0 if generations.empty?

  total_duration = generations.sum do |g|
    ((g.end_time - g.start_time) * 1000).round(2)
  end
  (total_duration / generations.count).round(0)
end

#chatObject



131
132
133
# File 'app/models/observ/session.rb', line 131

def chat
  @chat ||= ::Chat.find_by(observability_session_id: session_id) if defined?(::Chat)
end

#create_trace(name: nil, input: nil, metadata: {}, tags: []) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
# File 'app/models/observ/session.rb', line 22

def create_trace(name: nil, input: nil, metadata: {}, tags: [])
  traces.create!(
    trace_id: SecureRandom.uuid,
    name: name || "chat_exchange",
    input: input.is_a?(String) ? input : input.to_json,
    metadata: ,
    tags: tags,
    user_id: user_id,
    start_time: Time.current
  )
end

#duration_sObject



39
40
41
42
# File 'app/models/observ/session.rb', line 39

def duration_s
  return nil unless end_time
  (end_time - start_time).round(1)
end

#finalizeObject



34
35
36
37
# File 'app/models/observ/session.rb', line 34

def finalize
  update!(end_time: Time.current)
  update_aggregated_metrics
end

#instrument_chat(chat_instance, context: {}) ⇒ Object



97
98
99
100
101
102
103
104
105
# File 'app/models/observ/session.rb', line 97

def instrument_chat(chat_instance, context: {})
  instrumenter = Observ::ChatInstrumenter.new(
    self,
    chat_instance,
    context: context
  )
  instrumenter.instrument!
  instrumenter
end

#instrument_embedding(context: {}) ⇒ Object



107
108
109
110
111
# File 'app/models/observ/session.rb', line 107

def instrument_embedding(context: {})
  instrumenter = Observ::EmbeddingInstrumenter.new(self, context: context)
  instrumenter.instrument!
  instrumenter
end

#instrument_image_generation(context: {}) ⇒ Object



113
114
115
116
117
# File 'app/models/observ/session.rb', line 113

def instrument_image_generation(context: {})
  instrumenter = Observ::ImageGenerationInstrumenter.new(self, context: context)
  instrumenter.instrument!
  instrumenter
end

#instrument_moderation(context: {}) ⇒ Object



125
126
127
128
129
# File 'app/models/observ/session.rb', line 125

def instrument_moderation(context: {})
  instrumenter = Observ::ModerationInstrumenter.new(self, context: context)
  instrumenter.instrument!
  instrumenter
end

#instrument_transcription(context: {}) ⇒ Object



119
120
121
122
123
# File 'app/models/observ/session.rb', line 119

def instrument_transcription(context: {})
  instrumenter = Observ::TranscriptionInstrumenter.new(self, context: context)
  instrumenter.instrument!
  instrumenter
end

#session_metricsObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'app/models/observ/session.rb', line 56

def session_metrics
  if end_time.nil?
    {
      session_id: session_id,
      total_traces: traces.count,
      total_llm_calls: generation_count,
      total_tokens: traces.sum(:total_tokens),
      total_cost: traces.sum(:total_cost).to_f,
      total_llm_duration_ms: calculate_total_llm_duration,
      average_llm_latency_ms: average_llm_latency_ms,
      duration_s: duration_s
    }
  else
    {
      session_id: session_id,
      total_traces: total_traces_count,
      total_llm_calls: total_llm_calls_count,
      total_tokens: total_tokens,
      total_cost: total_cost.to_f,
      total_llm_duration_ms: total_llm_duration_ms,
      average_llm_latency_ms: average_llm_latency_ms,
      duration_s: duration_s
    }
  end
end

#update_aggregated_metricsObject



82
83
84
85
86
87
88
89
90
# File 'app/models/observ/session.rb', line 82

def update_aggregated_metrics
  update_columns(
    total_traces_count: traces.count,
    total_llm_calls_count: generation_count,
    total_tokens: traces.sum(:total_tokens),
    total_cost: traces.sum(:total_cost),
    total_llm_duration_ms: calculate_total_llm_duration
  )
end

#update_metadata(new_metadata) ⇒ Object



92
93
94
95
# File 'app/models/observ/session.rb', line 92

def ()
  self. = (self. || {}).merge()
  save
end