raix 2.0.1 → 2.0.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: 101c916df93e569b21330ea028dafac8d095021a7c2c27bb91a911fffc55bc29
4
- data.tar.gz: 1b4498f818350fab8823a66535334f24f2b89ede02d79cadcc23e052e3cd0dcb
3
+ metadata.gz: 44058aeb590e21ead9e7db9ebdc9a4ecffc9f4771b75663e137b22ecca4cd7d2
4
+ data.tar.gz: c59475844e68ef02379d85f7dde02540a58e7659d6b44a7fb83db7f491998635
5
5
  SHA512:
6
- metadata.gz: e5953aa12e7918e5b0266e23017c5c11874d919c4b83a10403c10a75d6998c2d8f2d3f8a11ab3d6abcf996f0ee30d827a564bd9ed5fd5862f673c689c6e8a06a
7
- data.tar.gz: 41aabaa233555d191a02628055465e5759aea86de69c321ff43145b6ddcc1714d5c2828ebf659d7f4773e6de8d04ec647435c5c7e1a001b196bea7c6dee8c0f7
6
+ metadata.gz: 76c43e2109fc3ec1be374c2b5df9e024ad09274e2ece3df976eb6f961d022123453bb995f6f0680921df5f224c439cbd19ec8eac8d5acc201d80193541396509
7
+ data.tar.gz: c0ee5f840e83718168668cf844a2cb3e7969f2cd5e199235b8532049660aab0cf7750abcf0e8748ffda7427fee73c7739fc37060c739efc64bcf7b04867c9da5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## [Unreleased]
2
+
3
+ ## [2.0.3] - 2026-04-30
4
+
5
+ ### Fixed
6
+ - `NoMethodError: undefined method 'strip' for nil` in `Raix::ChatCompletion` when an LLM (notably Gemini under certain stop conditions) returns a final assistant message with `"content": null`. Three call sites in `lib/raix/chat_completion.rb` now use `content.to_s.strip` so a nil response coerces to `""` instead of raising.
7
+
8
+ ## [2.0.2] - 2026-03-27
9
+
10
+ ### Fixed
11
+ - Ensure gem files are world-readable (644) for Docker deployments where gems are installed as root but the app runs as a non-root user
12
+ - Added gemspec-level safety net that normalizes file permissions at build time
13
+
1
14
  ## [2.0.1] - 2026-03-20
2
15
 
3
16
  ### Changed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- raix (2.0.1)
4
+ raix (2.0.3)
5
5
  activesupport (>= 6.0)
6
6
  faraday-retry (~> 2.0)
7
7
  ostruct
@@ -49,8 +49,8 @@ GEM
49
49
  net-http
50
50
  faraday-retry (2.4.0)
51
51
  faraday (~> 2.0)
52
- ffi (1.17.2)
53
52
  ffi (1.17.2-arm64-darwin)
53
+ ffi (1.17.2-x86_64-linux-gnu)
54
54
  formatador (1.1.0)
55
55
  guard (2.18.1)
56
56
  formatador (>= 0.2.4)
@@ -83,18 +83,16 @@ GEM
83
83
  lumberjack (1.2.10)
84
84
  marcel (1.1.0)
85
85
  method_source (1.1.0)
86
- mini_portile2 (2.8.9)
87
86
  minitest (5.27.0)
88
87
  multipart-post (2.4.1)
89
88
  nenv (0.3.0)
90
89
  net-http (0.4.1)
91
90
  uri
92
91
  netrc (0.11.0)
93
- nokogiri (1.18.8)
94
- mini_portile2 (~> 2.8.2)
95
- racc (~> 1.4)
96
92
  nokogiri (1.18.8-arm64-darwin)
97
93
  racc (~> 1.4)
94
+ nokogiri (1.18.8-x86_64-linux-gnu)
95
+ racc (~> 1.4)
98
96
  notiffany (0.1.3)
99
97
  nenv (~> 0.1)
100
98
  shellany (~> 0.0)
@@ -174,7 +174,7 @@ module Raix
174
174
  # Process the final response
175
175
  content = response.dig("choices", 0, "message", "content")
176
176
  transcript << { assistant: content } if save_response
177
- return raw ? response : content.strip
177
+ return raw ? response : content.to_s.strip
178
178
  end
179
179
 
180
180
  # Dispatch tool calls
@@ -215,7 +215,7 @@ module Raix
215
215
 
216
216
  content = response.dig("choices", 0, "message", "content")
217
217
  transcript << { assistant: content } if save_response
218
- return raw ? response : content.strip
218
+ return raw ? response : content.to_s.strip
219
219
  end
220
220
  end
221
221
 
@@ -223,7 +223,7 @@ module Raix
223
223
  content = res.dig("choices", 0, "message", "content")
224
224
 
225
225
  transcript << { assistant: content } if save_response
226
- content = content.strip
226
+ content = content.to_s.strip
227
227
 
228
228
  if json
229
229
  # Make automatic JSON parsing available to non-OpenAI providers that don't support the response_format parameter
data/lib/raix/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Raix
4
- VERSION = "2.0.1"
4
+ VERSION = "2.0.3"
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: raix
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Obie Fernandez
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-03-20 00:00:00.000000000 Z
10
+ date: 2026-04-30 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: activesupport
@@ -114,7 +114,6 @@ files:
114
114
  - lib/raix/response_format.rb
115
115
  - lib/raix/transcript_adapter.rb
116
116
  - lib/raix/version.rb
117
- - raix.gemspec
118
117
  - sig/raix.rbs
119
118
  homepage: https://github.com/OlympiaAI/raix
120
119
  licenses:
data/raix.gemspec DELETED
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "lib/raix/version"
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "raix"
7
- spec.version = Raix::VERSION
8
- spec.authors = ["Obie Fernandez"]
9
- spec.email = ["obiefernandez@gmail.com"]
10
-
11
- spec.summary = "Ruby AI eXtensions"
12
- spec.homepage = "https://github.com/OlympiaAI/raix"
13
- spec.license = "MIT"
14
- spec.required_ruby_version = ">= 3.2.2"
15
-
16
- spec.metadata["homepage_uri"] = spec.homepage
17
- spec.metadata["source_code_uri"] = "https://github.com/OlympiaAI/raix"
18
- spec.metadata["changelog_uri"] = "https://github.com/OlympiaAI/raix/blob/main/CHANGELOG.md"
19
-
20
- # Specify which files should be added to the gem when it is released.
21
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
- spec.files = Dir.chdir(__dir__) do
23
- `git ls-files -z`.split("\x0").reject do |f|
24
- (File.expand_path(f) == __FILE__) || f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor])
25
- end
26
- end
27
- spec.bindir = "exe"
28
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
- spec.require_paths = ["lib"]
30
-
31
- spec.add_dependency "activesupport", ">= 6.0"
32
- spec.add_dependency "faraday-retry", "~> 2.0"
33
- spec.add_dependency "ostruct"
34
- spec.add_dependency "ruby_llm", "~> 1.9"
35
- spec.add_dependency "zeitwerk", "~> 2.7"
36
- end