Class: Tools::MetaToolWriteService

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
app/services/tools/meta_tool_write_service.rb

Instance Method Summary collapse

Instance Method Details

#delete_tool(tool_name) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'app/services/tools/meta_tool_write_service.rb', line 53

def delete_tool(tool_name)
  schema = meta_service.find_schema(tool_name)
  return { error: "Tool not found: #{tool_name}" } unless schema

  service_class = schema[:service_class]
  ToolMeta.registry.delete(service_class)

  tool_constant = ToolSchema::RubyLlmFactory.tool_class_name(service_class)
  Tools.send(:remove_const, tool_constant) if Tools.const_defined?(tool_constant, false)
  fast_mcp_constant = ToolSchema::FastMcpFactory.tool_class_name(service_class)
  Mcp.send(:remove_const, fast_mcp_constant) if Mcp.const_defined?(fast_mcp_constant, false)

  { success: 'Tool deleted successfully' }
rescue StandardError => e
  { error: e.message }
end

#register_tool(class_name, before_call: nil, after_call: nil) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'app/services/tools/meta_tool_write_service.rb', line 15

def register_tool(class_name, before_call: nil, after_call: nil)
  return { error: 'class_name is required for register' } if class_name.nil? || class_name.empty?

  service_class = constantize(class_name)
  return { error: "Could not find #{class_name}" } if service_class.nil?
  return { error: "#{class_name} must extend ToolMeta" } unless service_class.respond_to?(:tool_metadata)

  ToolMeta.registry << service_class unless ToolMeta.registry.include?(service_class)

  schema = ToolSchema::Builder.build(service_class)
  ToolSchema::RubyLlmFactory.build(service_class, schema, before_call: before_call, after_call: after_call)
  ToolSchema::FastMcpFactory.build(service_class, schema, before_call: before_call, after_call: after_call)

  { status: 'registered', tool: meta_service.summary_payload(schema) }
rescue ToolMeta::MissingSignatureError => e
  { error: e.message }
rescue NameError => e
  { error: "Could not find #{class_name}: #{e.message}" }
end

#register_tool_from_source(source: nil, before_call: nil, after_call: nil) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'app/services/tools/meta_tool_write_service.rb', line 36

def register_tool_from_source(source: nil, before_call: nil, after_call: nil)
  class_name = extract_class_name(source)
  return { error: 'class_name is required for register' } if class_name.nil? || class_name.empty?

  # If source is provided, evaluate it first
  if source
    begin
      Object.class_eval(source)
    rescue StandardError => e
      return { error: "Failed to evaluate source: #{e.message}" }
    end
  end

  register_tool(class_name, before_call: before_call, after_call: after_call)
end