ruby_llm 0.1.0.pre22 → 0.1.0.pre23
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/chat.rb +3 -1
- data/lib/ruby_llm/error.rb +16 -7
- data/lib/ruby_llm/message.rb +1 -1
- data/lib/ruby_llm/models.rb +1 -1
- data/lib/ruby_llm/provider.rb +31 -9
- data/lib/ruby_llm/providers/anthropic.rb +2 -1
- data/lib/ruby_llm/providers/openai.rb +2 -1
- data/lib/ruby_llm/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: a893618117abc58f882b6efd81a5799e6236f62b70e16da07f921a4b28052b76
|
4
|
+
data.tar.gz: ad7430d3c55b4c076bbcd6e175f41f8f28328b73b25ccd4fc63fa70168d97388
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee65d074180e56c933cb9a3790665599601ae2adf480a0ae8884c3bebdfb00f9a84a04123f2f47a6f72f8933e9819a4b3b75666a8b5d72bea8e2b307eec04e84
|
7
|
+
data.tar.gz: bfbe48f502b4bc6049af967c27fe6e438c65193dbe473ac5701b8322d083cab03771cf94ebe38614907238a95710b780483795f6870f31952c30d3689f0cfc08
|
data/lib/ruby_llm/chat.rb
CHANGED
@@ -33,7 +33,9 @@ module RubyLLM
|
|
33
33
|
alias say ask
|
34
34
|
|
35
35
|
def with_tool(tool)
|
36
|
-
|
36
|
+
unless @model.supports_functions
|
37
|
+
raise UnsupportedFunctionsError, "Model #{@model.id} doesn't support function calling"
|
38
|
+
end
|
37
39
|
|
38
40
|
tool_instance = tool.is_a?(Class) ? tool.new : tool
|
39
41
|
@tools[tool_instance.name.to_sym] = tool_instance
|
data/lib/ruby_llm/error.rb
CHANGED
@@ -19,6 +19,9 @@ module RubyLLM
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
class ModelNotFoundError < StandardError; end
|
23
|
+
class InvalidRoleError < StandardError; end
|
24
|
+
class UnsupportedFunctionsError < StandardError; end
|
22
25
|
class UnauthorizedError < Error; end
|
23
26
|
class BadRequestError < Error; end
|
24
27
|
class RateLimitError < Error; end
|
@@ -27,24 +30,30 @@ module RubyLLM
|
|
27
30
|
# Faraday middleware that maps provider-specific API errors to RubyLLM errors.
|
28
31
|
# Uses provider's parse_error method to extract meaningful error messages.
|
29
32
|
class ErrorMiddleware < Faraday::Middleware
|
30
|
-
def initialize(app, provider:
|
33
|
+
def initialize(app, provider:)
|
31
34
|
super(app)
|
32
35
|
@provider = provider
|
33
36
|
end
|
34
37
|
|
35
|
-
def call(env)
|
38
|
+
def call(env)
|
36
39
|
@app.call(env).on_complete do |response|
|
37
|
-
|
40
|
+
self.class.parse_error(provider: @provider, response: response)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class << self
|
45
|
+
def parse_error(provider:, response:) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
|
46
|
+
message = provider&.parse_error(response)
|
38
47
|
|
39
48
|
case response.status
|
40
49
|
when 400
|
41
|
-
raise BadRequestError.new(response, message)
|
50
|
+
raise BadRequestError.new(response, message || 'Invalid request - please check your input')
|
42
51
|
when 401
|
43
|
-
raise UnauthorizedError.new(response, 'Invalid API key - check your credentials')
|
52
|
+
raise UnauthorizedError.new(response, message || 'Invalid API key - check your credentials')
|
44
53
|
when 429
|
45
|
-
raise RateLimitError.new(response, 'Rate limit exceeded - please wait a moment')
|
54
|
+
raise RateLimitError.new(response, message || 'Rate limit exceeded - please wait a moment')
|
46
55
|
when 500..599
|
47
|
-
raise ServerError.new(response, 'API server error - please try again')
|
56
|
+
raise ServerError.new(response, message || 'API server error - please try again')
|
48
57
|
end
|
49
58
|
end
|
50
59
|
end
|
data/lib/ruby_llm/message.rb
CHANGED
@@ -48,7 +48,7 @@ module RubyLLM
|
|
48
48
|
private
|
49
49
|
|
50
50
|
def ensure_valid_role
|
51
|
-
raise
|
51
|
+
raise InvalidRoleError, "Expected role to be one of: #{ROLES.join(', ')}" unless ROLES.include?(role)
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
data/lib/ruby_llm/models.rb
CHANGED
data/lib/ruby_llm/provider.rb
CHANGED
@@ -74,20 +74,43 @@ module RubyLLM
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
def to_json_stream(&block)
|
77
|
+
def to_json_stream(&block) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
78
|
+
buffer = String.new
|
78
79
|
parser = EventStreamParser::Parser.new
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
80
|
+
|
81
|
+
proc do |chunk, _bytes, env|
|
82
|
+
if env && env.status != 200
|
83
|
+
# Accumulate error chunks
|
84
|
+
buffer << chunk
|
85
|
+
begin
|
86
|
+
error_data = JSON.parse(buffer)
|
87
|
+
error_response = env.merge(body: error_data)
|
88
|
+
ErrorMiddleware.parse_error(provider: self, response: error_response)
|
89
|
+
rescue JSON::ParserError
|
90
|
+
# Keep accumulating if we don't have complete JSON yet
|
91
|
+
RubyLLM.logger.debug "Accumulating error chunk: #{chunk}"
|
92
|
+
end
|
93
|
+
else
|
94
|
+
parser.feed(chunk) do |_type, data|
|
95
|
+
unless data == '[DONE]'
|
96
|
+
parsed_data = JSON.parse(data)
|
97
|
+
RubyLLM.logger.debug "chunk: #{parsed_data}"
|
98
|
+
block.call(parsed_data)
|
99
|
+
end
|
85
100
|
end
|
86
101
|
end
|
87
102
|
end
|
88
103
|
end
|
89
104
|
end
|
90
105
|
|
106
|
+
def try_parse_json(maybe_json)
|
107
|
+
return maybe_json if maybe_json.is_a?(Hash)
|
108
|
+
|
109
|
+
JSON.parse(maybe_json)
|
110
|
+
rescue JSON::ParserError
|
111
|
+
maybe_json
|
112
|
+
end
|
113
|
+
|
91
114
|
class << self
|
92
115
|
def register(name, provider_class)
|
93
116
|
providers[name.to_sym] = provider_class
|
@@ -95,8 +118,7 @@ module RubyLLM
|
|
95
118
|
|
96
119
|
def for(model)
|
97
120
|
model_info = Models.find(model)
|
98
|
-
provider_class = providers[model_info.provider.to_sym]
|
99
|
-
raise Error, "No provider registered for #{model_info.provider}"
|
121
|
+
provider_class = providers[model_info.provider.to_sym]
|
100
122
|
|
101
123
|
provider_class.new
|
102
124
|
end
|
data/lib/ruby_llm/version.rb
CHANGED