ruby_llm-mcp 0.6.2 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f6b3a7fc52258ae0e1a8e5635b7c7347165b2c78da97ba1cfa1bc3633390eb39
4
- data.tar.gz: d2220a770be8038c8fa794196742f8c35d390e4020b838a9d7279c449b5894b0
3
+ metadata.gz: fa780ea2ca1b1ba71c5efa1784b14e9473ad351af94f0dc35d94aab4d6057325
4
+ data.tar.gz: 1fd76e02e0f6e22087943eff186dbb05cd059e931927442982752cbb9250aa98
5
5
  SHA512:
6
- metadata.gz: 4d6d145ab20653923ce4a557f6cc6d44b10f395a7c54dde228d69fe9f7e175e6d56ae6b6382ceae6dd32878305757271843e09a81ea07aaca2a1741a0f8f29a3
7
- data.tar.gz: 50872333e5206d74d30dd612d8e09db65665957cca705e6f20cf3f72460896332e0c5ea271ab2fa88659421dc4d1a07b0fe217ed9b925d237993b59baf4f94a2
6
+ metadata.gz: 5c37a73381c487a02d61bb8365e39b064b37a0d0668bd46eae1bd25ad225982c8f15229867cd4110e89689ec5757e395ce3825795298aabc3f4ed3b8cd49e0e5
7
+ data.tar.gz: ecb7f5524d9af14c3386abb3ddae91bee454046449ae2e0bba758c95060157c057222a57ce1b9eae5af197e5ec8187e34474fb3801b7cdabb92fdb3cbe14ddd2
@@ -30,7 +30,6 @@ module RubyLLM
30
30
  "Accept" => "text/event-stream",
31
31
  "Content-Type" => "application/json",
32
32
  "Cache-Control" => "no-cache",
33
- "Connection" => "keep-alive",
34
33
  "X-CLIENT-ID" => @client_id
35
34
  })
36
35
 
@@ -167,41 +166,82 @@ module RubyLLM
167
166
  end
168
167
 
169
168
  def stream_events_from_server
170
- sse_client = HTTPX.plugin(:stream)
171
- sse_client = sse_client.with(
172
- headers: @headers
173
- )
169
+ sse_client = create_sse_client
170
+ response = sse_client.get(@event_url, stream: true)
171
+ validate_sse_response!(response)
172
+ process_event_stream(response)
173
+ end
174
174
 
175
- if @version == :http1
176
- sse_client = sse_client.with(
177
- ssl: { alpn_protocols: ["http/1.1"] }
178
- )
179
- end
175
+ def create_sse_client
176
+ sse_client = HTTPX.plugin(:stream).with(headers: @headers)
177
+ return sse_client unless @version == :http1
180
178
 
181
- response = sse_client.get(@event_url, stream: true)
179
+ sse_client.with(ssl: { alpn_protocols: ["http/1.1"] })
180
+ end
181
+
182
+ def validate_sse_response!(response)
183
+ return unless response.status >= 400
184
+
185
+ error_body = read_error_body(response)
186
+ error_message = "HTTP #{response.status} error from SSE endpoint: #{error_body}"
187
+ RubyLLM::MCP.logger.error error_message
188
+
189
+ handle_client_error!(error_message, response.status) if response.status < 500
190
+
191
+ raise StandardError, error_message
192
+ end
193
+
194
+ def handle_client_error!(error_message, status_code)
195
+ @running = false
196
+ raise Errors::TransportError.new(
197
+ message: error_message,
198
+ code: status_code
199
+ )
200
+ end
182
201
 
202
+ def process_event_stream(response)
183
203
  event_buffer = []
184
204
  response.each_line do |event_line|
185
- unless @running
186
- response.body.close
187
- next
188
- end
205
+ break unless handle_event_line?(event_line, event_buffer, response)
206
+ end
207
+ end
189
208
 
190
- # Strip the line and check if it's empty (indicates end of event)
191
- line = event_line.strip
209
+ def handle_event_line?(event_line, event_buffer, response)
210
+ unless @running
211
+ response.body.close
212
+ return false
213
+ end
192
214
 
193
- if line.empty?
194
- # End of event - process the accumulated buffer
195
- if event_buffer.any?
196
- events = parse_event(event_buffer.join("\n"))
197
- events.each { |event| process_event(event) }
198
- event_buffer.clear
199
- end
200
- else
201
- # Accumulate the line for the current event
202
- event_buffer << line
215
+ line = event_line.strip
216
+
217
+ if line.empty?
218
+ process_buffered_event(event_buffer)
219
+ else
220
+ event_buffer << line
221
+ end
222
+
223
+ true
224
+ end
225
+
226
+ def process_buffered_event(event_buffer)
227
+ return unless event_buffer.any?
228
+
229
+ events = parse_event(event_buffer.join("\n"))
230
+ events.each { |event| process_event(event) }
231
+ event_buffer.clear
232
+ end
233
+
234
+ def read_error_body(response)
235
+ # Try to read the error body from the response
236
+ body = ""
237
+ begin
238
+ response.each do |chunk|
239
+ body << chunk
203
240
  end
241
+ rescue StandardError
242
+ # If we can't read the body, just use what we have
204
243
  end
244
+ body.strip.empty? ? "No error details provided" : body.strip
205
245
  end
206
246
 
207
247
  def handle_connection_error(message, error)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RubyLLM
4
4
  module MCP
5
- VERSION = "0.6.2"
5
+ VERSION = "0.6.3"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_llm-mcp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Vice