Skip to content

Commit d34592e

Browse files
authored
Fix tool name method to strip unsupported characters for OpenAI (#28)
Updates the `name` method in the `Tool` class to strip unsupported characters and replace them with the closest characters as OpenAI only supports tool names with `/a-zA-Z0-9_-/+`
1 parent d97d903 commit d34592e

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

lib/ruby_llm/tool.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ def parameters
5050

5151
def name
5252
self.class.name
53+
.unicode_normalize(:nfkd)
54+
.encode('ASCII', replace: '')
55+
.gsub(/[^a-zA-Z0-9_-]/, '-')
5356
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
5457
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
5558
.downcase

spec/ruby_llm/tool_spec.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
RSpec.describe RubyLLM::Tool do
6+
describe '#name' do
7+
it 'converts class name to snake_case and removes _tool suffix' do
8+
stub_const('SampleTool', Class.new(described_class))
9+
expect(SampleTool.new.name).to eq('sample')
10+
end
11+
12+
# rubocop:disable Naming/AsciiIdentifiers
13+
14+
it 'normalizes class name Unicode characters to ASCII' do
15+
stub_const('SàmpleTòol', Class.new(described_class))
16+
expect(SàmpleTòol.new.name).to eq('sample')
17+
end
18+
19+
it 'handles class names with unsupported characters' do
20+
stub_const('SampleΨTool', Class.new(described_class))
21+
expect(SampleΨTool.new.name).to eq('sample')
22+
end
23+
24+
# rubocop:enable Naming/AsciiIdentifiers
25+
26+
it 'handles class names without Tool suffix' do
27+
stub_const('AnotherSample', Class.new(described_class))
28+
expect(AnotherSample.new.name).to eq('another_sample')
29+
end
30+
31+
it 'strips :: for class in module namespace' do
32+
stub_const('TestModule::SampleTool', Class.new(described_class))
33+
expect(TestModule::SampleTool.new.name).to eq('test_module--sample')
34+
end
35+
end
36+
end

0 commit comments

Comments
 (0)