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.
@@ -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 '- 根据不同场景选择合适的刷新策略'
@@ -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