Module: Langfuse::Utils

Defined in:
lib/langfuse/utils.rb

Constant Summary collapse

VERBATIM_BODY_KEYS =

Body keys whose values must be passed through verbatim (user data), everything else nested under them keeps its original key format.

%w[input output metadata usageDetails costDetails modelParameters].freeze

Class Method Summary collapse

Class Method Details

.current_timestamp ⇒ Object



28
29
30
# File 'lib/langfuse/utils.rb', line 28

def current_timestamp
  Time.now.utc.iso8601(3)
end

.deep_camelize_keys(object) ⇒ Object Also known as: deep_stringify_keys

将哈希的键名转换为小驼峰格式



51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/langfuse/utils.rb', line 51

def deep_camelize_keys(object)
  case object
  when Hash
    object.each_with_object({}) do |(key, value), result|
      new_key = camelize_key(key.to_s)
      result[new_key] = deep_camelize_keys(value)
    end
  when Array
    object.map { |item| deep_camelize_keys(item) }
  else
    object
  end
end

.deep_symbolize_keys(object) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/langfuse/utils.rb', line 36

def deep_symbolize_keys(object)
  case object
  when Hash
    object.each_with_object({}) do |(key, value), result|
      new_key = key.is_a?(String) ? key.to_sym : key
      result[new_key] = deep_symbolize_keys(value)
    end
  when Array
    object.map { |item| deep_symbolize_keys(item) }
  else
    object
  end
end

.generate_hex_span_id ⇒ Object

W3C-compatible 16-char hex span/observation ID (8 bytes), used for OTel ingestion



24
25
26
# File 'lib/langfuse/utils.rb', line 24

def generate_hex_span_id
  SecureRandom.hex(8)
end

.generate_hex_trace_id ⇒ Object

W3C-compatible 32-char hex trace ID (16 bytes), used for OTel ingestion



19
20
21
# File 'lib/langfuse/utils.rb', line 19

def generate_hex_trace_id
  SecureRandom.hex(16)
end

.generate_id ⇒ Object



14
15
16
# File 'lib/langfuse/utils.rb', line 14

def generate_id
  SecureRandom.uuid
end

.prepare_event_body(body) ⇒ Object

Prepare an event body for the ingestion API:

  • top-level keys are camelized (snake_case -> camelCase)
  • user data values (input/output/metadata/usageDetails/costDetails/modelParameters) are passed through verbatim so user-provided keys are not mangled
  • the legacy usage object keys are camelized (prompt_tokens -> promptTokens)


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

def prepare_event_body(body)
  return body unless body.is_a?(Hash)

  body.each_with_object({}) do |(key, value), result|
    new_key = camelize_key(key.to_s)
    result[new_key] = if !VERBATIM_BODY_KEYS.include?(new_key) && value.is_a?(Hash)
                        deep_camelize_keys(value)
                      else
                        value
                      end
  end
end

.url_encode(string) ⇒ Object



32
33
34
# File 'lib/langfuse/utils.rb', line 32

def url_encode(string)
  ERB::Util.url_encode(string.to_s)
end