Skip to content

Commit cbc653a

Browse files
authored
Track Langfuse sessions and users (#174)
1 parent ed99a4d commit cbc653a

File tree

4 files changed

+63
-8
lines changed

4 files changed

+63
-8
lines changed

app/models/assistant/responder.rb

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ def get_llm_response(streamer:, function_results: [], previous_response_id: nil)
6767
functions: function_tool_caller.function_definitions,
6868
function_results: function_results,
6969
streamer: streamer,
70-
previous_response_id: previous_response_id
70+
previous_response_id: previous_response_id,
71+
session_id: chat_session_id,
72+
user_identifier: chat_user_identifier
7173
)
7274

7375
unless response.success?
@@ -84,4 +86,18 @@ def emit(event_name, payload = nil)
8486
def listeners
8587
@listeners ||= Hash.new { |h, k| h[k] = [] }
8688
end
89+
90+
def chat_session_id
91+
chat&.id&.to_s
92+
end
93+
94+
def chat_user_identifier
95+
return unless chat&.user_id
96+
97+
::Digest::SHA256.hexdigest(chat.user_id.to_s)
98+
end
99+
100+
def chat
101+
@chat ||= message.chat
102+
end
87103
end

app/models/provider/llm_concept.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,17 @@ def auto_detect_merchants(transactions)
1818
ChatResponse = Data.define(:id, :model, :messages, :function_requests)
1919
ChatFunctionRequest = Data.define(:id, :call_id, :function_name, :function_args)
2020

21-
def chat_response(prompt, model:, instructions: nil, functions: [], function_results: [], streamer: nil, previous_response_id: nil)
21+
def chat_response(
22+
prompt,
23+
model:,
24+
instructions: nil,
25+
functions: [],
26+
function_results: [],
27+
streamer: nil,
28+
previous_response_id: nil,
29+
session_id: nil,
30+
user_identifier: nil
31+
)
2232
raise NotImplementedError, "Subclasses must implement #chat_response"
2333
end
2434
end

app/models/provider/openai.rb

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,17 @@ def auto_detect_merchants(transactions: [], user_merchants: [], model: "")
5858
end
5959
end
6060

61-
def chat_response(prompt, model:, instructions: nil, functions: [], function_results: [], streamer: nil, previous_response_id: nil)
61+
def chat_response(
62+
prompt,
63+
model:,
64+
instructions: nil,
65+
functions: [],
66+
function_results: [],
67+
streamer: nil,
68+
previous_response_id: nil,
69+
session_id: nil,
70+
user_identifier: nil
71+
)
6272
with_provider_response do
6373
chat_config = ChatConfig.new(
6474
functions: functions,
@@ -101,7 +111,9 @@ def chat_response(prompt, model:, instructions: nil, functions: [], function_res
101111
name: "chat_response",
102112
model: model,
103113
input: input_payload,
104-
output: response.messages.map(&:output_text).join("\n")
114+
output: response.messages.map(&:output_text).join("\n"),
115+
session_id: session_id,
116+
user_identifier: user_identifier
105117
)
106118
response
107119
else
@@ -111,7 +123,9 @@ def chat_response(prompt, model:, instructions: nil, functions: [], function_res
111123
model: model,
112124
input: input_payload,
113125
output: parsed.messages.map(&:output_text).join("\n"),
114-
usage: raw_response["usage"]
126+
usage: raw_response["usage"],
127+
session_id: session_id,
128+
user_identifier: user_identifier
115129
)
116130
parsed
117131
end
@@ -127,16 +141,23 @@ def langfuse_client
127141
@langfuse_client = Langfuse.new
128142
end
129143

130-
def log_langfuse_generation(name:, model:, input:, output:, usage: nil)
144+
def log_langfuse_generation(name:, model:, input:, output:, usage: nil, session_id: nil, user_identifier: nil)
131145
return unless langfuse_client
132146

133-
trace = langfuse_client.trace(name: "openai.#{name}", input: input)
147+
trace = langfuse_client.trace(
148+
name: "openai.#{name}",
149+
input: input,
150+
session_id: session_id,
151+
user_id: user_identifier
152+
)
134153
trace.generation(
135154
name: name,
136155
model: model,
137156
input: input,
138157
output: output,
139-
usage: usage
158+
usage: usage,
159+
session_id: session_id,
160+
user_id: user_identifier
140161
)
141162
trace.update(output: output)
142163
rescue => e

test/models/assistant_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class AssistantTest < ActiveSupport::TestCase
1212
)
1313
@assistant = Assistant.for_chat(@chat)
1414
@provider = mock
15+
@expected_session_id = @chat.id.to_s
16+
@expected_user_identifier = ::Digest::SHA256.hexdigest(@chat.user_id.to_s)
1517
end
1618

1719
test "errors get added to chat" do
@@ -46,6 +48,8 @@ class AssistantTest < ActiveSupport::TestCase
4648
response = provider_success_response(response_chunk.data)
4749

4850
@provider.expects(:chat_response).with do |message, **options|
51+
assert_equal @expected_session_id, options[:session_id]
52+
assert_equal @expected_user_identifier, options[:user_identifier]
4953
text_chunks.each do |text_chunk|
5054
options[:streamer].call(text_chunk)
5155
end
@@ -98,6 +102,8 @@ class AssistantTest < ActiveSupport::TestCase
98102
sequence = sequence("provider_chat_response")
99103

100104
@provider.expects(:chat_response).with do |message, **options|
105+
assert_equal @expected_session_id, options[:session_id]
106+
assert_equal @expected_user_identifier, options[:user_identifier]
101107
call2_text_chunks.each do |text_chunk|
102108
options[:streamer].call(text_chunk)
103109
end
@@ -107,6 +113,8 @@ class AssistantTest < ActiveSupport::TestCase
107113
end.returns(call2_response).once.in_sequence(sequence)
108114

109115
@provider.expects(:chat_response).with do |message, **options|
116+
assert_equal @expected_session_id, options[:session_id]
117+
assert_equal @expected_user_identifier, options[:user_identifier]
110118
options[:streamer].call(call1_response_chunk)
111119
true
112120
end.returns(call1_response).once.in_sequence(sequence)

0 commit comments

Comments
 (0)