Class: Legion::Extensions::Llm::Tool
- Inherits:
-
Object
- Object
- Legion::Extensions::Llm::Tool
show all
- Defined in:
- lib/legion/extensions/llm/tool.rb
Overview
Base class for creating tools that AI models can use
Defined Under Namespace
Classes: Halt, SchemaDefinition
Class Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Class Attribute Details
.params_schema_definition ⇒ Object
Returns the value of attribute params_schema_definition.
36
37
38
|
# File 'lib/legion/extensions/llm/tool.rb', line 36
def params_schema_definition
@params_schema_definition
end
|
Class Method Details
.description(text = nil) ⇒ Object
38
39
40
41
42
|
# File 'lib/legion/extensions/llm/tool.rb', line 38
def description(text = nil)
return @description unless text
@description = text
end
|
.param(name) ⇒ Object
44
45
46
|
# File 'lib/legion/extensions/llm/tool.rb', line 44
def param(name, **)
parameters[name] = Parameter.new(name, **)
end
|
.parameters ⇒ Object
48
49
50
|
# File 'lib/legion/extensions/llm/tool.rb', line 48
def parameters
@parameters ||= {}
end
|
.params(schema = nil, &block) ⇒ Object
52
53
54
55
|
# File 'lib/legion/extensions/llm/tool.rb', line 52
def params(schema = nil, &block)
@params_schema_definition = SchemaDefinition.new(schema:, block:)
self
end
|
.provider_params ⇒ Object
62
63
64
|
# File 'lib/legion/extensions/llm/tool.rb', line 62
def provider_params
@provider_params ||= {}
end
|
.with_params(**params) ⇒ Object
57
58
59
60
|
# File 'lib/legion/extensions/llm/tool.rb', line 57
def with_params(**params)
@provider_params = params
self
end
|
Instance Method Details
#call(args) ⇒ Object
103
104
105
106
107
108
109
110
111
112
|
# File 'lib/legion/extensions/llm/tool.rb', line 103
def call(args)
normalized_args = normalize_args(args)
validation_error = validate_keyword_arguments(normalized_args)
return { error: "Invalid tool arguments: #{validation_error}" } if validation_error
Legion::Extensions::Llm.logger.debug { "Tool #{name} called with: #{normalized_args.inspect}" }
result = execute(**normalized_args)
Legion::Extensions::Llm.logger.debug { "Tool #{name} returned: #{result.inspect}" }
result
end
|
#description ⇒ Object
78
79
80
|
# File 'lib/legion/extensions/llm/tool.rb', line 78
def description
self.class.description
end
|
#execute ⇒ Object
114
115
116
|
# File 'lib/legion/extensions/llm/tool.rb', line 114
def execute(...)
raise NotImplementedError, 'Subclasses must implement #execute'
end
|
#name ⇒ Object
67
68
69
70
71
72
73
74
75
76
|
# File 'lib/legion/extensions/llm/tool.rb', line 67
def name
klass_name = self.class.name
normalized = klass_name.to_s.dup.force_encoding('UTF-8').unicode_normalize(:nfkd)
normalized.encode('ASCII', replace: '')
.gsub(/[^a-zA-Z0-9_-]/, '-')
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
.downcase
.delete_suffix('_tool')
end
|
#parameters ⇒ Object
82
83
84
|
# File 'lib/legion/extensions/llm/tool.rb', line 82
def parameters
self.class.parameters
end
|
#params_schema ⇒ Object
90
91
92
93
94
95
96
97
98
99
100
101
|
# File 'lib/legion/extensions/llm/tool.rb', line 90
def params_schema
return @params_schema if defined?(@params_schema)
@params_schema = begin
definition = self.class.params_schema_definition
if definition&.present?
definition.json_schema
elsif parameters.any?
SchemaDefinition.from_parameters(parameters)&.json_schema
end
end
end
|
#provider_params ⇒ Object
86
87
88
|
# File 'lib/legion/extensions/llm/tool.rb', line 86
def provider_params
self.class.provider_params
end
|