Class: Ask::Tool

Inherits:
Object
  • Object
show all
Defined in:
lib/ask/tools/tool.rb

Defined Under Namespace

Classes: Halt, Parameter

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.descObject



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

.parametersObject



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_paramsObject



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.message}")
end

#descriptionObject



84
85
86
# File 'lib/ask/tools/tool.rb', line 84

def description
  self.class.description
end

#executeObject

Raises:

  • (NotImplementedError)


103
104
105
# File 'lib/ask/tools/tool.rb', line 103

def execute(**)
  raise NotImplementedError, "#{self.class} must implement #execute(**args)"
end

#inspectObject



126
127
128
# File 'lib/ask/tools/tool.rb', line 126

def inspect
  "#<#{self.class.name} name=#{name.inspect}>"
end

#nameObject



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

#parametersObject



88
89
90
# File 'lib/ask/tools/tool.rb', line 88

def parameters
  self.class.parameters
end

#params_schemaObject



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_paramsObject



69
70
71
# File 'lib/ask/tools/tool.rb', line 69

def provider_params
  self.class.provider_params
end

#tool_definitionObject



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