Class: Ask::Tool
- Inherits:
-
Object
- Object
- Ask::Tool
- Defined in:
- lib/ask/tools/tool.rb
Defined Under Namespace
Class Method Summary collapse
- .desc ⇒ Object
- .description(text = nil) ⇒ Object
- .inherited(subclass) ⇒ Object
- .param(name, type:, desc: nil, description: nil, required: true) ⇒ Object
- .parameters ⇒ Object
- .params(schema = nil, &block) ⇒ Object
- .provider_params ⇒ Object
Instance Method Summary collapse
- #call(args = {}) ⇒ Object
- #description ⇒ Object
- #execute ⇒ Object
- #inspect ⇒ Object
- #name ⇒ Object
- #parameters ⇒ Object
- #params_schema ⇒ Object
- #provider_params ⇒ Object
- #tool_definition ⇒ Object
Class Method Details
.desc ⇒ Object
28 29 30 31 |
# File 'lib/ask/tools/tool.rb', line 28 def description(text = nil) return @description unless text @description = text end |
.description(text = nil) ⇒ Object
24 25 26 27 |
# File 'lib/ask/tools/tool.rb', line 24 def description(text = nil) return @description unless text @description = text end |
.inherited(subclass) ⇒ Object
16 17 18 19 20 21 22 |
# File 'lib/ask/tools/tool.rb', line 16 def inherited(subclass) super @parameters = {} if @parameters.nil? subclass.instance_variable_set(:@description, nil) subclass.instance_variable_set(:@parameters, {}) subclass.instance_variable_set(:@params_schema_definition, nil) end |
.param(name, type:, desc: nil, description: nil, required: true) ⇒ Object
30 31 32 33 34 35 36 37 |
# File 'lib/ask/tools/tool.rb', line 30 def param(name, type:, desc: nil, description: nil, required: true) type = type.to_s.downcase.to_sym validate_param_type!(type, name) parameters[name] = Parameter.new( name: name, type: map_type(type), description: desc || description, required: required ) end |
.parameters ⇒ Object
43 44 45 |
# File 'lib/ask/tools/tool.rb', line 43 def parameters @parameters ||= {} end |
.params(schema = nil, &block) ⇒ Object
39 40 41 |
# File 'lib/ask/tools/tool.rb', line 39 def params(schema = nil, &block) @params_schema_definition = schema || block end |
.provider_params ⇒ Object
47 48 49 |
# File 'lib/ask/tools/tool.rb', line 47 def provider_params @provider_params ||= {} end |
Instance Method Details
#call(args = {}) ⇒ Object
92 93 94 95 96 97 98 99 100 101 |
# File 'lib/ask/tools/tool.rb', line 92 def call(args = {}) normalized = normalize_args(args) validation = validate(normalized) return Ask::Result.failure(validation) if validation execute(**normalized) rescue Halt => e Ask::Result.ok(data: e.content, metadata: { halted: true }) rescue StandardError => e Ask::Result.failure("#{self.class.name.split('::').last} raised #{e.class}: #{e.}") end |
#description ⇒ Object
84 85 86 |
# File 'lib/ask/tools/tool.rb', line 84 def description self.class.description end |
#execute ⇒ Object
103 104 105 |
# File 'lib/ask/tools/tool.rb', line 103 def execute(**) raise NotImplementedError, "#{self.class} must implement #execute(**args)" end |
#inspect ⇒ Object
126 127 128 |
# File 'lib/ask/tools/tool.rb', line 126 def inspect "#<#{self.class.name} name=#{name.inspect}>" end |
#name ⇒ Object
73 74 75 76 77 78 79 80 81 82 |
# File 'lib/ask/tools/tool.rb', line 73 def name klass_name = self.class.name.to_s || "" normalized = klass_name.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
88 89 90 |
# File 'lib/ask/tools/tool.rb', line 88 def parameters self.class.parameters end |
#params_schema ⇒ Object
107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/ask/tools/tool.rb', line 107 def params_schema return @params_schema if defined?(@params_schema) @params_schema = begin if params_schema_definition deep_stringify_keys(resolve_params_schema(params_schema_definition)) elsif parameters.any? build_schema_from_params else nil end end end |
#provider_params ⇒ Object
69 70 71 |
# File 'lib/ask/tools/tool.rb', line 69 def provider_params self.class.provider_params end |
#tool_definition ⇒ Object
120 121 122 123 124 |
# File 'lib/ask/tools/tool.rb', line 120 def tool_definition defn = { name: name, description: description } defn[:input_schema] = params_schema if params_schema defn end |