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 +4 -4
- data/lib/ruby_llm/mcp/transports/sse.rb +67 -27
- data/lib/ruby_llm/mcp/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fa780ea2ca1b1ba71c5efa1784b14e9473ad351af94f0dc35d94aab4d6057325
|
|
4
|
+
data.tar.gz: 1fd76e02e0f6e22087943eff186dbb05cd059e931927442982752cbb9250aa98
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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 =
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
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
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
end
|
|
205
|
+
break unless handle_event_line?(event_line, event_buffer, response)
|
|
206
|
+
end
|
|
207
|
+
end
|
|
189
208
|
|
|
190
|
-
|
|
191
|
-
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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)
|
data/lib/ruby_llm/mcp/version.rb
CHANGED