diff --git a/app/lib/tool_meta.rb b/app/lib/tool_meta.rb index 0a59d18..5d7c522 100644 --- a/app/lib/tool_meta.rb +++ b/app/lib/tool_meta.rb @@ -21,6 +21,7 @@ def self.extended(base) base.instance_variable_set(:@tool_params, T.let([], T::Array[ParamMetadata])) base.instance_variable_set(:@tool_name, nil) base.instance_variable_set(:@tool_description, nil) + base.instance_variable_set(:@tool_type, nil) end sig { returns(T::Array[T.class_of(Object)]) } @@ -43,6 +44,11 @@ def tool_description(description) @tool_description = description end + sig { params(type: Symbol).void } + def tool_type(type) + @tool_type = type + end + sig do params( name: T.any(String, Symbol), @@ -72,6 +78,7 @@ def tool_metadata { name: @tool_name || default_tool_name, description: @tool_description || '', + type: @tool_type || :write, params: @tool_params, entrypoint: tool_entrypoint } diff --git a/app/lib/tool_schema/builder.rb b/app/lib/tool_schema/builder.rb index dff2ae8..99a51be 100644 --- a/app/lib/tool_schema/builder.rb +++ b/app/lib/tool_schema/builder.rb @@ -27,6 +27,7 @@ def self.build(service_class) { name: metadata[:name], description: metadata[:description], + type: metadata[:type], params: params_ast, return_type: type_info[:return_type], entrypoint: entrypoint, diff --git a/app/services/tools/meta_tool_service.rb b/app/services/tools/meta_tool_service.rb index fd66145..dab999c 100644 --- a/app/services/tools/meta_tool_service.rb +++ b/app/services/tools/meta_tool_service.rb @@ -118,6 +118,7 @@ def summary_payload(schema) { name: schema[:name], description: schema[:description], + type: schema[:type], usage: usage_string(schema) } end diff --git a/test/meta_tool_service_test.rb b/test/meta_tool_service_test.rb index 99ab632..ad5fda9 100644 --- a/test/meta_tool_service_test.rb +++ b/test/meta_tool_service_test.rb @@ -136,6 +136,25 @@ def test_ruby_llm_tools_preserves_hooks assert before_called, 'Before hook should be preserved when fetching via ruby_llm_tools' end + def test_tool_type_metadata + Tools.const_set(:ReadService, Class.new do + extend T::Sig + extend ToolMeta + + tool_name 'read_stuff' + tool_description 'Read some stuff' + tool_type :read + + sig { void } + def call; end + end) + + schema = ToolSchema::Builder.build(Tools::ReadService) + assert_equal :read, schema[:type] + + Tools.send(:remove_const, :ReadService) + end + private def meta_service