Project

rsmolagent

0.0
The project is in a healthy, maintained state
RSmolagent is a Ruby library for building AI agents that can use tools to solve tasks. Supports both OpenAI and Claude models with automatic retries and rate limiting capabilities.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Development

~> 3.0
~> 0.3.0

Runtime

~> 2.0
 Project Readme

RSmolagent

A lightweight Ruby library for creating AI agents that can use tools to solve tasks. Inspired by Python's smolagents library, RSmolagent provides a simple way to build agents that can interact with the world through tools.

Installation

Add this line to your application's Gemfile:

gem 'rsmolagent'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install rsmolagent

Usage

RSmolagent is designed to be simple to use. Here's a basic example:

require 'rsmolagent'
require 'ruby/openai'

# Create a custom tool
class CalculatorTool < RSmolagent::Tool
  def initialize
    super(
      name: "calculator",
      description: "Perform mathematical calculations",
      input_schema: {
        expression: {
          type: "string",
          description: "The mathematical expression to evaluate"
        }
      }
    )
  end

  def execute(args)
    expression = args[:expression]
    eval(expression).to_s
  rescue => e
    "Error: #{e.message}"
  end
end

# Initialize OpenAI client
client = OpenAI::Client.new(access_token: ENV["OPENAI_API_KEY"])

# Create LLM provider
llm = RSmolagent::OpenAIProvider.new(
  model_id: "gpt-3.5-turbo",
  client: client
)

# Create agent with tools
calculator = CalculatorTool.new
agent = RSmolagent::Agent.new(
  llm_provider: llm,
  tools: [calculator]
)

# Run the agent
result = agent.run("What is 123 * 456?")
puts result  # Outputs the calculated result

Features

  • Simple interface for creating AI agents
  • Support for custom tools
  • Built-in memory for tracking conversation history
  • Works with OpenAI API (easily extensible to other LLM providers)
  • Automatic handling of tool calls and responses
  • Built-in tools including web search
  • Dynamic code execution and custom tool creation
  • Ability to create tools from Ruby code at runtime

Built-in Tools

RSmolagent comes with several built-in tools:

WebSearchTool

Searches the web using DuckDuckGo's API:

# Create a web search tool
web_search = RSmolagent::Tools::WebSearchTool.new(max_results: 3)

# Add it to your agent
agent = RSmolagent::Agent.new(
  llm_provider: llm,
  tools: [web_search]
)

# The agent can now search the web
result = agent.run("What are the latest developments in AI?")

Ruby Code Execution Tools

RSmolagent provides tools for executing Ruby code, allowing you to create custom tools dynamically:

1. RubyExecutorTool

Executes arbitrary Ruby code in a controlled environment:

# Create a Ruby executor tool
ruby_executor = RSmolagent::Tools::RubyExecutorTool.new

# Add it to your agent
agent = RSmolagent::Agent.new(
  llm_provider: llm,
  tools: [ruby_executor]
)

# The agent can now execute Ruby code
result = agent.run("Calculate the factorial of 5")

2. CustomClassExecutorTool

Creates and executes custom tool classes with defined structure:

# Create a custom tool executor
custom_executor = RSmolagent::Tools::CustomClassExecutorTool.new

# Add it to your agent
agent = RSmolagent::Agent.new(
  llm_provider: llm,
  tools: [custom_executor]
)

# The agent can now create and use custom tools
result = agent.run("Create a tool to get the current date and then use it")

3. Creating Custom Tools from Code

You can also create tools from code directly using the CustomToolFactory:

# Define a custom tool class
tool_code = <<~RUBY
  class MyCustomTool < CustomToolBase
    def initialize
      super(
        "my_tool",
        "Description of what my tool does",
        {
          param1: {
            type: "string",
            description: "Parameter description"
          }
        }
      )
    end
    
    def run(args)
      # Implement tool logic here
      "Result: " + args[:param1].upcase
    end
  end
RUBY

# Create a tool from the code
my_tool = RSmolagent::Tools::CustomToolFactory.create_from_code(tool_code)

# Use the tool
my_tool.call(param1: "hello world")  # => "Result: HELLO WORLD"

Creating Custom Tools

To create a custom tool, simply inherit from RSmolagent::Tool and implement the execute method:

class MyTool < RSmolagent::Tool
  def initialize
    super(
      name: "my_tool",
      description: "Description of what the tool does",
      input_schema: {
        param1: {
          type: "string",
          description: "Description of parameter 1"
        },
        param2: {
          type: "number",
          description: "Description of parameter 2"
        }
      }
    )
  end

  def execute(args)
    # Implement your tool logic here
    # args will contain the parameters passed by the agent
    "Result of the tool execution"
  end
end

Supporting Other LLM Providers

To add support for other LLM providers, inherit from RSmolagent::LLMProvider and implement the required methods:

class MyLLMProvider < RSmolagent::LLMProvider
  def initialize(model_id:, **options)
    super(model_id: model_id, **options)
    # Initialize your LLM client
  end

  def chat(messages, tools: nil, tool_choice: nil)
    # Call your LLM provider's API
    # Return the response in a standardized format
  end

  def extract_tool_calls(response)
    # Extract tool calls from the response
    # Return an array of tool calls in the format:
    # [{ name: "tool_name", arguments: { param1: "value1", ... } }, ...]
  end
end

Testing

RSmolagent includes a comprehensive test suite using RSpec. To run the tests:

# Install development dependencies
$ bundle install

# Run the tests
$ bundle exec rake spec

License

The gem is available as open source under the terms of the MIT License.