langfuse-ruby 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +59 -0
- data/Gemfile +5 -5
- data/Gemfile.lock +1 -1
- data/README.md +111 -20
- data/docs/PUBLISH_GUIDE.md +2 -2
- data/docs/README.md +0 -4
- data/docs/TYPE_VALIDATION_TROUBLESHOOTING.md +202 -0
- data/examples/auto_flush_control.rb +205 -0
- data/examples/basic_tracing.rb +0 -12
- data/examples/connection_config_demo.rb +141 -0
- data/examples/event_usage.rb +145 -0
- data/examples/prompt_management.rb +62 -71
- data/lib/langfuse/client.rb +176 -58
- data/lib/langfuse/event.rb +63 -0
- data/lib/langfuse/generation.rb +19 -40
- data/lib/langfuse/span.rb +17 -0
- data/lib/langfuse/trace.rb +17 -34
- data/lib/langfuse/utils.rb +23 -1
- data/lib/langfuse/version.rb +1 -1
- data/lib/langfuse.rb +5 -2
- data/test_offline.rb +93 -101
- metadata +8 -7
- data/.github/workflows/ci.yml +0 -47
- data/PROMPT_TROUBLESHOOTING.md +0 -206
- data/docs/CHANGELOG.md +0 -49
- data/docs/PROJECT_SUMMARY.md +0 -263
- data/test_basic.rb +0 -183
@@ -0,0 +1,205 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/langfuse'
|
4
|
+
|
5
|
+
puts '🚀 Langfuse Ruby SDK 自动刷新控制演示'
|
6
|
+
puts '=' * 50
|
7
|
+
|
8
|
+
# 示例 1: 启用自动刷新(默认行为)
|
9
|
+
puts "\n📝 示例 1: 启用自动刷新(默认行为)"
|
10
|
+
puts '代码示例:'
|
11
|
+
puts 'client = Langfuse.new('
|
12
|
+
puts " public_key: 'pk-lf-your-public-key',"
|
13
|
+
puts " secret_key: 'sk-lf-your-secret-key',"
|
14
|
+
puts ' auto_flush: true # 默认为 true,可以省略'
|
15
|
+
puts ')'
|
16
|
+
|
17
|
+
client_auto = Langfuse.new(
|
18
|
+
public_key: 'test-public-key',
|
19
|
+
secret_key: 'test-secret-key',
|
20
|
+
auto_flush: true,
|
21
|
+
flush_interval: 2 # 2秒刷新一次用于演示
|
22
|
+
)
|
23
|
+
|
24
|
+
puts '✅ 自动刷新客户端创建成功'
|
25
|
+
puts " 自动刷新: #{client_auto.auto_flush}"
|
26
|
+
puts " 刷新间隔: #{client_auto.flush_interval}秒"
|
27
|
+
|
28
|
+
# 创建一些事件
|
29
|
+
trace_auto = client_auto.trace(
|
30
|
+
name: 'auto-flush-demo',
|
31
|
+
input: { message: '这是自动刷新演示' },
|
32
|
+
metadata: { demo: true }
|
33
|
+
)
|
34
|
+
|
35
|
+
puts '✅ 创建了 trace,将在后台自动刷新'
|
36
|
+
|
37
|
+
# 示例 2: 禁用自动刷新
|
38
|
+
puts "\n📝 示例 2: 禁用自动刷新"
|
39
|
+
puts '代码示例:'
|
40
|
+
puts 'client = Langfuse.new('
|
41
|
+
puts " public_key: 'pk-lf-your-public-key',"
|
42
|
+
puts " secret_key: 'sk-lf-your-secret-key',"
|
43
|
+
puts ' auto_flush: false # 禁用自动刷新'
|
44
|
+
puts ')'
|
45
|
+
|
46
|
+
client_manual = Langfuse.new(
|
47
|
+
public_key: 'test-public-key',
|
48
|
+
secret_key: 'test-secret-key',
|
49
|
+
auto_flush: false
|
50
|
+
)
|
51
|
+
|
52
|
+
puts '✅ 手动刷新客户端创建成功'
|
53
|
+
puts " 自动刷新: #{client_manual.auto_flush}"
|
54
|
+
puts " 刷新间隔: #{client_manual.flush_interval}秒(不会自动刷新)"
|
55
|
+
|
56
|
+
# 创建一些事件
|
57
|
+
trace_manual = client_manual.trace(
|
58
|
+
name: 'manual-flush-demo',
|
59
|
+
input: { message: '这是手动刷新演示' },
|
60
|
+
metadata: { demo: true }
|
61
|
+
)
|
62
|
+
|
63
|
+
generation_manual = trace_manual.generation(
|
64
|
+
name: 'manual-generation',
|
65
|
+
model: 'gpt-3.5-turbo',
|
66
|
+
input: [{ role: 'user', content: 'Hello!' }],
|
67
|
+
output: { content: '你好!' },
|
68
|
+
usage: { prompt_tokens: 5, completion_tokens: 3, total_tokens: 8 }
|
69
|
+
)
|
70
|
+
|
71
|
+
puts '✅ 创建了 trace 和 generation,需要手动刷新'
|
72
|
+
puts " 事件队列长度: #{client_manual.instance_variable_get(:@event_queue).length}"
|
73
|
+
|
74
|
+
# 手动刷新(离线模式,不实际发送)
|
75
|
+
puts "\n🔄 手动刷新事件(离线模式)..."
|
76
|
+
puts ' 注意:在实际应用中,这里会发送事件到 Langfuse 服务器'
|
77
|
+
puts ' 当前为演示模式,不会实际发送请求'
|
78
|
+
# client_manual.flush # 注释掉以避免网络请求
|
79
|
+
puts " 事件队列长度: #{client_manual.instance_variable_get(:@event_queue).length}"
|
80
|
+
|
81
|
+
# 示例 3: 通过全局配置控制
|
82
|
+
puts "\n📝 示例 3: 通过全局配置控制"
|
83
|
+
puts '代码示例:'
|
84
|
+
puts 'Langfuse.configure do |config|'
|
85
|
+
puts " config.public_key = 'pk-lf-your-public-key'"
|
86
|
+
puts " config.secret_key = 'sk-lf-your-secret-key'"
|
87
|
+
puts ' config.auto_flush = false # 全局禁用自动刷新'
|
88
|
+
puts ' config.flush_interval = 10'
|
89
|
+
puts 'end'
|
90
|
+
|
91
|
+
Langfuse.configure do |config|
|
92
|
+
config.public_key = 'test-public-key'
|
93
|
+
config.secret_key = 'test-secret-key'
|
94
|
+
config.auto_flush = false
|
95
|
+
config.flush_interval = 10
|
96
|
+
end
|
97
|
+
|
98
|
+
client_global = Langfuse.new
|
99
|
+
puts '✅ 全局配置客户端创建成功'
|
100
|
+
puts " 自动刷新: #{client_global.auto_flush}"
|
101
|
+
puts " 刷新间隔: #{client_global.flush_interval}秒"
|
102
|
+
|
103
|
+
# 示例 4: 通过环境变量控制
|
104
|
+
puts "\n📝 示例 4: 通过环境变量控制"
|
105
|
+
puts '设置环境变量:'
|
106
|
+
puts "export LANGFUSE_PUBLIC_KEY='pk-lf-your-public-key'"
|
107
|
+
puts "export LANGFUSE_SECRET_KEY='sk-lf-your-secret-key'"
|
108
|
+
puts 'export LANGFUSE_AUTO_FLUSH=false'
|
109
|
+
puts 'export LANGFUSE_FLUSH_INTERVAL=15'
|
110
|
+
puts ''
|
111
|
+
puts '然后使用:'
|
112
|
+
puts 'client = Langfuse.new'
|
113
|
+
|
114
|
+
# 模拟环境变量
|
115
|
+
ENV['LANGFUSE_AUTO_FLUSH'] = 'false'
|
116
|
+
ENV['LANGFUSE_FLUSH_INTERVAL'] = '15'
|
117
|
+
|
118
|
+
client_env = Langfuse.new(
|
119
|
+
public_key: 'test-public-key',
|
120
|
+
secret_key: 'test-secret-key'
|
121
|
+
)
|
122
|
+
|
123
|
+
puts '✅ 环境变量配置客户端创建成功'
|
124
|
+
puts " 自动刷新: #{client_env.auto_flush}"
|
125
|
+
puts " 刷新间隔: #{client_env.flush_interval}秒"
|
126
|
+
|
127
|
+
# 清理环境变量
|
128
|
+
ENV.delete('LANGFUSE_AUTO_FLUSH')
|
129
|
+
ENV.delete('LANGFUSE_FLUSH_INTERVAL')
|
130
|
+
|
131
|
+
# 示例 5: 混合使用场景
|
132
|
+
puts "\n📝 示例 5: 混合使用场景"
|
133
|
+
puts '在某些情况下,您可能希望:'
|
134
|
+
puts '1. 大部分时间使用自动刷新'
|
135
|
+
puts '2. 在批量操作时临时禁用自动刷新'
|
136
|
+
puts '3. 在操作完成后手动刷新'
|
137
|
+
|
138
|
+
# 批量操作示例
|
139
|
+
puts "\n🔄 批量操作演示..."
|
140
|
+
batch_client = Langfuse.new(
|
141
|
+
public_key: 'test-public-key',
|
142
|
+
secret_key: 'test-secret-key',
|
143
|
+
auto_flush: false # 禁用自动刷新以提高批量操作性能
|
144
|
+
)
|
145
|
+
|
146
|
+
# 批量创建多个 traces
|
147
|
+
traces = []
|
148
|
+
10.times do |i|
|
149
|
+
trace = batch_client.trace(
|
150
|
+
name: "batch-trace-#{i}",
|
151
|
+
input: { batch_id: i },
|
152
|
+
metadata: { batch_operation: true }
|
153
|
+
)
|
154
|
+
traces << trace
|
155
|
+
end
|
156
|
+
|
157
|
+
puts "✅ 批量创建了 #{traces.length} 个 traces"
|
158
|
+
puts " 事件队列长度: #{batch_client.instance_variable_get(:@event_queue).length}"
|
159
|
+
|
160
|
+
# 批量操作完成后手动刷新(离线模式)
|
161
|
+
puts "\n🔄 批量操作完成,执行手动刷新(离线模式)..."
|
162
|
+
puts ' 注意:在实际应用中,这里会发送所有事件到 Langfuse 服务器'
|
163
|
+
# batch_client.flush # 注释掉以避免网络请求
|
164
|
+
puts " 事件队列长度: #{batch_client.instance_variable_get(:@event_queue).length}(未发送)"
|
165
|
+
|
166
|
+
# 使用建议
|
167
|
+
puts "\n💡 使用建议:"
|
168
|
+
puts '1. 默认情况下保持 auto_flush=true,适合大多数应用场景'
|
169
|
+
puts '2. 在批量操作或高频操作时,考虑设置 auto_flush=false'
|
170
|
+
puts '3. 禁用自动刷新时,记得在适当的时机调用 client.flush'
|
171
|
+
puts '4. 应用关闭前,务必调用 client.shutdown 确保所有事件都被发送'
|
172
|
+
puts '5. 可以通过环境变量在不同环境中控制刷新行为'
|
173
|
+
|
174
|
+
# 性能对比
|
175
|
+
puts "\n⚡ 性能对比:"
|
176
|
+
puts '自动刷新模式:'
|
177
|
+
puts ' - 优点:无需手动管理,事件及时发送'
|
178
|
+
puts ' - 缺点:后台线程消耗资源,可能影响高频操作性能'
|
179
|
+
puts ''
|
180
|
+
puts '手动刷新模式:'
|
181
|
+
puts ' - 优点:更好的性能控制,适合批量操作'
|
182
|
+
puts ' - 缺点:需要手动管理刷新时机,容易遗漏'
|
183
|
+
|
184
|
+
# 等待一下让自动刷新客户端工作
|
185
|
+
puts "\n⏳ 等待自动刷新客户端工作..."
|
186
|
+
sleep(3)
|
187
|
+
|
188
|
+
# 关闭所有客户端(离线模式)
|
189
|
+
puts "\n🔒 关闭所有客户端(离线模式)..."
|
190
|
+
puts ' 注意:在实际应用中,shutdown 会确保所有事件都被发送'
|
191
|
+
# 在演示模式下,我们只终止后台线程而不发送请求
|
192
|
+
client_auto.instance_variable_get(:@flush_thread)&.kill
|
193
|
+
client_manual.instance_variable_get(:@flush_thread)&.kill
|
194
|
+
client_global.instance_variable_get(:@flush_thread)&.kill
|
195
|
+
client_env.instance_variable_get(:@flush_thread)&.kill
|
196
|
+
batch_client.instance_variable_get(:@flush_thread)&.kill
|
197
|
+
|
198
|
+
puts "\n🎉 自动刷新控制演示完成!"
|
199
|
+
puts ''
|
200
|
+
puts '📚 总结:'
|
201
|
+
puts '现在您可以在应用层面灵活控制 Langfuse 的自动刷新行为:'
|
202
|
+
puts '- 通过构造函数参数 auto_flush 控制'
|
203
|
+
puts '- 通过全局配置 Langfuse.configure 控制'
|
204
|
+
puts '- 通过环境变量 LANGFUSE_AUTO_FLUSH 控制'
|
205
|
+
puts '- 根据不同场景选择合适的刷新策略'
|
data/examples/basic_tracing.rb
CHANGED
@@ -47,11 +47,6 @@ generation = trace.generation(
|
|
47
47
|
|
48
48
|
puts "Created generation: #{generation.id}"
|
49
49
|
|
50
|
-
# Update trace with final output
|
51
|
-
trace.update(
|
52
|
-
output: { response: "I'm doing well, thank you! How can I help you today?" }
|
53
|
-
)
|
54
|
-
|
55
50
|
puts "Trace URL: #{trace.get_url}"
|
56
51
|
|
57
52
|
# Example 2: Nested spans for complex workflow
|
@@ -130,13 +125,6 @@ answer_span.end(
|
|
130
125
|
}
|
131
126
|
)
|
132
127
|
|
133
|
-
# Update workflow trace
|
134
|
-
workflow_trace.update(
|
135
|
-
output: {
|
136
|
-
answer: 'Machine learning is a subset of artificial intelligence that enables computers to learn and improve from experience without being explicitly programmed. ML algorithms identify patterns in data and use these patterns to make predictions or decisions.'
|
137
|
-
}
|
138
|
-
)
|
139
|
-
|
140
128
|
puts "Workflow trace URL: #{workflow_trace.get_url}"
|
141
129
|
|
142
130
|
# Example 3: Adding scores and evaluations
|
@@ -0,0 +1,141 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/langfuse'
|
4
|
+
|
5
|
+
puts '🚀 Langfuse Ruby SDK 连接配置演示'
|
6
|
+
puts '=' * 50
|
7
|
+
|
8
|
+
# 显示默认配置
|
9
|
+
puts "\n📋 默认配置信息:"
|
10
|
+
puts " 默认主机: #{Langfuse.configuration.host}"
|
11
|
+
puts " 默认超时: #{Langfuse.configuration.timeout}秒"
|
12
|
+
puts " 默认重试: #{Langfuse.configuration.retries}次"
|
13
|
+
puts " 默认刷新间隔: #{Langfuse.configuration.flush_interval}秒"
|
14
|
+
puts " 默认自动刷新: #{Langfuse.configuration.auto_flush}"
|
15
|
+
|
16
|
+
# 方法 1: 使用测试密钥创建客户端(仅用于演示)
|
17
|
+
puts "\n📝 方法 1: 直接参数配置"
|
18
|
+
puts '代码示例:'
|
19
|
+
puts 'client = Langfuse.new('
|
20
|
+
puts " public_key: 'pk-lf-your-public-key',"
|
21
|
+
puts " secret_key: 'sk-lf-your-secret-key',"
|
22
|
+
puts " host: 'https://us.cloud.langfuse.com',"
|
23
|
+
puts ' flush_interval: 10, # 每10秒刷新一次'
|
24
|
+
puts ' auto_flush: true # 启用自动刷新(默认)'
|
25
|
+
puts ')'
|
26
|
+
|
27
|
+
# 使用测试密钥创建客户端
|
28
|
+
test_client = Langfuse.new(
|
29
|
+
public_key: 'test-public-key',
|
30
|
+
secret_key: 'test-secret-key',
|
31
|
+
host: 'https://us.cloud.langfuse.com'
|
32
|
+
)
|
33
|
+
|
34
|
+
puts '✅ 客户端配置成功'
|
35
|
+
puts " 主机: #{test_client.host}"
|
36
|
+
puts " 超时: #{test_client.timeout}秒"
|
37
|
+
puts " 重试: #{test_client.retries}次"
|
38
|
+
puts " 刷新间隔: #{test_client.flush_interval}秒"
|
39
|
+
puts " 自动刷新: #{test_client.auto_flush}"
|
40
|
+
|
41
|
+
# 方法 2: 全局配置
|
42
|
+
puts "\n📝 方法 2: 全局配置"
|
43
|
+
puts '代码示例:'
|
44
|
+
puts 'Langfuse.configure do |config|'
|
45
|
+
puts " config.public_key = 'pk-lf-your-public-key'"
|
46
|
+
puts " config.secret_key = 'sk-lf-your-secret-key'"
|
47
|
+
puts " config.host = 'https://us.cloud.langfuse.com'"
|
48
|
+
puts ' config.debug = true'
|
49
|
+
puts ' config.flush_interval = 10 # 每10秒刷新一次'
|
50
|
+
puts ' config.auto_flush = true # 启用自动刷新'
|
51
|
+
puts 'end'
|
52
|
+
|
53
|
+
Langfuse.configure do |config|
|
54
|
+
config.public_key = 'test-public-key'
|
55
|
+
config.secret_key = 'test-secret-key'
|
56
|
+
config.host = 'https://us.cloud.langfuse.com'
|
57
|
+
config.debug = true
|
58
|
+
config.timeout = 60
|
59
|
+
config.retries = 5
|
60
|
+
config.flush_interval = 10
|
61
|
+
config.auto_flush = true
|
62
|
+
end
|
63
|
+
|
64
|
+
global_client = Langfuse.new
|
65
|
+
puts '✅ 全局配置成功'
|
66
|
+
puts " 主机: #{global_client.host}"
|
67
|
+
puts " 调试模式: #{global_client.debug}"
|
68
|
+
puts " 超时: #{global_client.timeout}秒"
|
69
|
+
puts " 重试: #{global_client.retries}次"
|
70
|
+
puts " 刷新间隔: #{global_client.flush_interval}秒"
|
71
|
+
puts " 自动刷新: #{global_client.auto_flush}"
|
72
|
+
|
73
|
+
# 方法 3: 环境变量配置
|
74
|
+
puts "\n📝 方法 3: 环境变量配置"
|
75
|
+
puts '设置环境变量:'
|
76
|
+
puts "export LANGFUSE_PUBLIC_KEY='pk-lf-your-public-key'"
|
77
|
+
puts "export LANGFUSE_SECRET_KEY='sk-lf-your-secret-key'"
|
78
|
+
puts "export LANGFUSE_HOST='https://us.cloud.langfuse.com'"
|
79
|
+
puts 'export LANGFUSE_FLUSH_INTERVAL=10'
|
80
|
+
puts 'export LANGFUSE_AUTO_FLUSH=true'
|
81
|
+
puts ''
|
82
|
+
puts '然后使用:'
|
83
|
+
puts 'client = Langfuse.new'
|
84
|
+
|
85
|
+
if ENV['LANGFUSE_PUBLIC_KEY'] && ENV['LANGFUSE_SECRET_KEY']
|
86
|
+
env_client = Langfuse.new
|
87
|
+
puts '✅ 环境变量配置成功'
|
88
|
+
puts " 主机: #{env_client.host}"
|
89
|
+
else
|
90
|
+
puts '⚠️ 环境变量未设置,跳过此示例'
|
91
|
+
end
|
92
|
+
|
93
|
+
# 连接配置详情
|
94
|
+
puts "\n🔧 连接配置详情:"
|
95
|
+
puts '根据 Langfuse 官方文档:'
|
96
|
+
puts '1. 认证方式: HTTP Basic Auth'
|
97
|
+
puts '2. 用户名: Langfuse Public Key (pk-lf-...)'
|
98
|
+
puts '3. 密码: Langfuse Secret Key (sk-lf-...)'
|
99
|
+
puts '4. 默认服务器: https://us.cloud.langfuse.com'
|
100
|
+
puts '5. 内容类型: application/json'
|
101
|
+
puts "6. User-Agent: langfuse-ruby/#{Langfuse::VERSION}"
|
102
|
+
|
103
|
+
# 创建测试 trace(不发送到服务器)
|
104
|
+
puts "\n🧪 创建测试 Trace(离线):"
|
105
|
+
begin
|
106
|
+
trace = test_client.trace(
|
107
|
+
name: 'connection-test',
|
108
|
+
user_id: 'demo-user',
|
109
|
+
input: { message: '测试连接配置' },
|
110
|
+
metadata: { demo: true }
|
111
|
+
)
|
112
|
+
|
113
|
+
puts '✅ Trace 创建成功'
|
114
|
+
puts " ID: #{trace.id}"
|
115
|
+
puts " 名称: #{trace.name}"
|
116
|
+
puts " 用户ID: #{trace.user_id}"
|
117
|
+
|
118
|
+
# 添加 generation
|
119
|
+
generation = trace.generation(
|
120
|
+
name: 'demo-generation',
|
121
|
+
model: 'gpt-3.5-turbo',
|
122
|
+
input: [{ role: 'user', content: 'Hello!' }],
|
123
|
+
output: { content: '你好!' },
|
124
|
+
usage: { prompt_tokens: 5, completion_tokens: 3, total_tokens: 8 }
|
125
|
+
)
|
126
|
+
|
127
|
+
puts '✅ Generation 创建成功'
|
128
|
+
puts " ID: #{generation.id}"
|
129
|
+
puts " 模型: #{generation.model}"
|
130
|
+
rescue StandardError => e
|
131
|
+
puts "❌ 测试失败: #{e.message}"
|
132
|
+
end
|
133
|
+
|
134
|
+
puts "\n📚 使用提示:"
|
135
|
+
puts "1. 替换示例中的 'test-public-key' 和 'test-secret-key' 为您的真实 API 密钥"
|
136
|
+
puts '2. 确保网络连接正常'
|
137
|
+
puts '3. 启用 debug 模式可以查看详细的请求日志'
|
138
|
+
puts '4. 调用 client.flush 来发送事件到服务器'
|
139
|
+
puts '5. 使用 client.shutdown 来优雅地关闭客户端'
|
140
|
+
|
141
|
+
puts "\n🎉 连接配置演示完成!"
|
@@ -0,0 +1,145 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'langfuse'
|
4
|
+
|
5
|
+
# Initialize the Langfuse client
|
6
|
+
client = Langfuse.new(
|
7
|
+
public_key: ENV['LANGFUSE_PUBLIC_KEY'],
|
8
|
+
secret_key: ENV['LANGFUSE_SECRET_KEY'],
|
9
|
+
host: ENV['LANGFUSE_HOST'] || 'https://cloud.langfuse.com'
|
10
|
+
)
|
11
|
+
|
12
|
+
puts '🎯 Starting event usage example...'
|
13
|
+
|
14
|
+
# Example 1: Create a trace and add events
|
15
|
+
puts "\n📝 Example 1: Creating events within a trace"
|
16
|
+
|
17
|
+
trace = client.trace(
|
18
|
+
name: 'user-workflow',
|
19
|
+
user_id: 'user-123',
|
20
|
+
session_id: 'session-456',
|
21
|
+
input: { action: 'start_workflow' }
|
22
|
+
)
|
23
|
+
|
24
|
+
puts "Created trace: #{trace.id}"
|
25
|
+
|
26
|
+
# Create a generic event
|
27
|
+
event1 = trace.event(
|
28
|
+
name: 'user_login',
|
29
|
+
input: { username: 'john_doe', login_method: 'oauth' },
|
30
|
+
output: { success: true, user_id: 'user-123' },
|
31
|
+
metadata: {
|
32
|
+
ip_address: '192.168.1.1',
|
33
|
+
user_agent: 'Mozilla/5.0...'
|
34
|
+
}
|
35
|
+
)
|
36
|
+
|
37
|
+
puts "Created event: #{event1.id}"
|
38
|
+
|
39
|
+
# Create another event with custom level
|
40
|
+
event2 = trace.event(
|
41
|
+
name: 'data_processing',
|
42
|
+
input: { data_size: 1024, format: 'json' },
|
43
|
+
output: { processed_records: 100, errors: 0 },
|
44
|
+
level: 'INFO',
|
45
|
+
metadata: {
|
46
|
+
processing_time_ms: 250,
|
47
|
+
memory_usage: '45MB'
|
48
|
+
}
|
49
|
+
)
|
50
|
+
|
51
|
+
puts "Created event: #{event2.id}"
|
52
|
+
|
53
|
+
# Example 2: Creating events from spans
|
54
|
+
puts "\n🔗 Example 2: Creating events from spans"
|
55
|
+
|
56
|
+
span = trace.span(
|
57
|
+
name: 'data-validation',
|
58
|
+
input: { data: 'raw_data' }
|
59
|
+
)
|
60
|
+
|
61
|
+
# Create an event within the span
|
62
|
+
validation_event = span.event(
|
63
|
+
name: 'validation_check',
|
64
|
+
input: { rules: %w[required format length] },
|
65
|
+
output: { valid: true, warnings: [] },
|
66
|
+
metadata: { validation_time_ms: 15 }
|
67
|
+
)
|
68
|
+
|
69
|
+
puts "Created span event: #{validation_event.id}"
|
70
|
+
|
71
|
+
# End the span
|
72
|
+
span.end(output: { validation_result: 'passed' })
|
73
|
+
|
74
|
+
# Example 3: Creating events from generations
|
75
|
+
puts "\n🤖 Example 3: Creating events from generations"
|
76
|
+
|
77
|
+
generation = trace.generation(
|
78
|
+
name: 'text-generation',
|
79
|
+
model: 'gpt-3.5-turbo',
|
80
|
+
input: [{ role: 'user', content: 'Hello, how are you?' }],
|
81
|
+
output: { content: 'I am doing well, thank you!' },
|
82
|
+
usage: { prompt_tokens: 12, completion_tokens: 8, total_tokens: 20 }
|
83
|
+
)
|
84
|
+
|
85
|
+
# Create an event for content filtering
|
86
|
+
filter_event = generation.event(
|
87
|
+
name: 'content_filter',
|
88
|
+
input: { text: 'I am doing well, thank you!' },
|
89
|
+
output: {
|
90
|
+
filtered: false,
|
91
|
+
flags: [],
|
92
|
+
confidence: 0.95
|
93
|
+
},
|
94
|
+
metadata: {
|
95
|
+
filter_model: 'content-filter-v1',
|
96
|
+
processing_time_ms: 5
|
97
|
+
}
|
98
|
+
)
|
99
|
+
|
100
|
+
puts "Created generation event: #{filter_event.id}"
|
101
|
+
|
102
|
+
# Example 4: Error event
|
103
|
+
puts "\n❌ Example 4: Error event"
|
104
|
+
|
105
|
+
error_event = trace.event(
|
106
|
+
name: 'error_occurred',
|
107
|
+
input: { operation: 'database_query' },
|
108
|
+
output: {
|
109
|
+
error: true,
|
110
|
+
message: 'Connection timeout',
|
111
|
+
code: 'DB_TIMEOUT'
|
112
|
+
},
|
113
|
+
level: 'ERROR',
|
114
|
+
status_message: 'Database connection failed',
|
115
|
+
metadata: {
|
116
|
+
retry_count: 3,
|
117
|
+
last_attempt: Time.now.iso8601
|
118
|
+
}
|
119
|
+
)
|
120
|
+
|
121
|
+
puts "Created error event: #{error_event.id}"
|
122
|
+
|
123
|
+
puts "Trace URL: #{trace.get_url}"
|
124
|
+
|
125
|
+
# Example 5: Direct event creation via client
|
126
|
+
puts "\n🎯 Example 5: Direct event creation via client"
|
127
|
+
|
128
|
+
direct_event = client.event(
|
129
|
+
trace_id: trace.id,
|
130
|
+
name: 'audit_log',
|
131
|
+
input: { action: 'workflow_completed', user_id: 'user-123' },
|
132
|
+
output: { logged: true, log_id: 'audit-789' },
|
133
|
+
metadata: {
|
134
|
+
timestamp: Time.now.iso8601,
|
135
|
+
source: 'audit_system'
|
136
|
+
}
|
137
|
+
)
|
138
|
+
|
139
|
+
puts "Created direct event: #{direct_event.id}"
|
140
|
+
|
141
|
+
puts "\n✅ Event usage example completed!"
|
142
|
+
puts 'Check the Langfuse dashboard to see all events in the trace.'
|
143
|
+
|
144
|
+
# Flush events to ensure they're sent
|
145
|
+
client.flush
|