- Дата публикации
RubyLLM: единый Ruby-фреймворк для GPT, Claude, Gemini, Ollama и ещё сотен моделей
Что нового
RubyLLM — это единый фреймворк на Ruby, который закрывает почти весь спектр задач вокруг генеративного ИИ:
- один интерфейс для всех крупных поставщиков: OpenAI (GPT), xAI, Anthropic (Claude), Google Gemini, VertexAI, Amazon Bedrock, DeepSeek, Mistral, Ollama, OpenRouter, Perplexity, GPUStack и любых OpenAI-совместимых API;
- реестр из 800+ моделей с автоматическим определением возможностей и цен (capability detection и pricing);
- поддержка чата, vision, генерации изображений, эмбеддингов, транскрибации аудио, модерации контента;
- работа с файлами разных типов: изображения, видео, аудио, PDF, CSV, JSON, текстовые файлы;
- инструменты (Tools): ИИ может вызывать ваши Ruby-методы как функции;
- агенты (RubyLLM::Agent): переиспользуемые ассистенты с инструкциями и набором инструментов;
- структурированный вывод по JSON-схемам (RubyLLM::Schema);
- стриминг ответов через блоки Ruby;
- интеграция с Rails:
acts_as_chatдля ActiveRecord и готовый Chat UI-генератор; - асинхронность на базе Ruby Fibers;
- контроль «рассуждений» моделей: можно управлять, просматривать и сохранять внутреннюю делиберацию.
Под капотом только три зависимости: Faraday, Zeitwerk и Marcel. Библиотека уже проверена в продакшене в проекте Fully private work AI.
Как это работает
RubyLLM даёт один высокоуровневый API поверх разных провайдеров ИИ. Вы пишете код в стиле:
chat = RubyLLM.chat
chat.ask "What's the best way to learn Ruby?"
и дальше можете переключать модель или провайдера без переписывания логики. Настройка ключей проходит через конфигурацию:
# config/initializers/ruby_llm.rb
RubyLLM.configure do |config|
config.openai_api_key = ENV['OPENAI_API_KEY']
end
Фреймворк сам выбирает нужный клиент и форматирует запросы и ответы. Разные типы задач закрываются отдельными методами верхнего уровня:
RubyLLM.chat— диалоговый ИИ;RubyLLM.paint— генерация изображений;RubyLLM.embed— эмбеддинги;RubyLLM.transcribe— транскрибация аудио;RubyLLM.moderate— модерация.
Работа с файлами завязана на автоматическое определение типа (Marcel) и упаковку в нужный формат для выбранного провайдера. Один и тот же вызов chat.ask может принимать путь к файлу или массив файлов:
chat.ask "What's in this image?", with: "ruby_conf.jpg"
chat.ask "Analyze these files", with: ["diagram.png", "report.pdf", "notes.txt"]
Стриминг реализован через блоки Ruby: фреймворк отдаёт куски ответа по мере генерации, а вы просто печатаете их или отправляете в WebSocket:
chat.ask "Tell me a story about Ruby" do |chunk|
print chunk.content
end
Инструменты оформляются как Ruby-классы, которые наследуются от RubyLLM::Tool. Внутри — обычный Ruby-код, который ИИ может вызывать по запросу пользователя:
class Weather < RubyLLM::Tool
desc "Get current weather"
def execute(latitude:, longitude:)
url = "https://api.open-meteo.com/v1/forecast?" \
"latitude=#{latitude}&longitude=#{longitude}" \
"¤t=temperature_2m,wind_speed_10m"
JSON.parse(Faraday.get(url).body)
end
end
chat.with_tool(Weather).ask "What's the weather in Berlin?"
Агенты — это класс-обёртка вокруг модели с фиксированными инструкциями и набором инструментов:
class WeatherAssistant < RubyLLM::Agent
model "gpt-5-nano"
instructions "Be concise and always use tools for weather."
tools Weather
end
WeatherAssistant.new.ask "What's the weather in Berlin?"
Для структурированного вывода RubyLLM использует декларативные схемы:
class ProductSchema < RubyLLM::Schema
string :name
number :price
array :features do
string
end
end
response = chat.with_schema(ProductSchema)
.ask "Analyze this product", with: "product.txt"
Rails-интеграция добавляет acts_as_chat к любой модели ActiveRecord. Фреймворк сам хранит историю диалога и параметры модели:
class Chat < ApplicationRecord
acts_as_chat
end
chat = Chat.create!(model: "claude-sonnet-4")
chat.ask "What's in this file?", with: "report.pdf"
Что это значит для вас
Когда RubyLLM особенно полезен
- Вы пишете на Ruby и Rails. Не нужно вручную собирать клиентов для OpenAI, Anthropic, Google и остальных. Один гем закрывает всё.
- Вы делаете чат-бот, ассистента или RAG-приложение. RubyLLM даёт чат, работу с файлами, эмбеддинги и инструменты в одном API. Это удобно для внутренних ассистентов, поддержки, генерации контента.
- Нужна поддержка нескольких провайдеров. Можно быстро переключаться между GPT, Claude, Gemini, Ollama или OpenRouter, не меняя бизнес-логику.
- Важно структурировать ответы. JSON-схемы и
RubyLLM::Schemaпомогают получать предсказуемый формат данных для интеграции с CRM, биллингом, внутренними сервисами. - Вы хотите дать ИИ доступ к коду и API. Инструменты (
RubyLLM::Tool) позволяют безопасно оборачивать внешние сервисы и Ruby-методы, чтобы ассистент мог, например, получать погоду, данные из БД или запускать операции. - Нужен стриминг. Блоки Ruby для поточного вывода подходят для чат-интерфейсов и live-обновлений в вебе.
Где RubyLLM может не подойти
- Если ваш стек — только Python или JavaScript, RubyLLM не решит интеграционные задачи напрямую.
- Если вы работаете только с одним провайдером (например, только GPT) и уже довольны его официальным клиентом, выгода от миграции будет меньше.
- Если нужен строго офлайн-режим без внешних API, придётся опираться только на Ollama или локальные OpenAI-совместимые бэкенды.
Доступность из России
RubyLLM — это клиентская библиотека, а не облачный сервис. Но он работает с внешними API: OpenAI, Anthropic, Google Gemini, VertexAI, Bedrock и другими. Для части этих сервисов может потребоваться VPN и платёжные инструменты, которые принимают зарубежные провайдеры. Если ваш проект развернут в инфраструктуре с ограниченным доступом к этим API, придётся либо настраивать прокси, либо использовать локальные решения вроде Ollama или OpenAI-совместимые self-hosted-сервисы.
Место на рынке
RubyLLM закрывает нишу «один гем для всех ИИ-поставщиков» в Ruby-мире. Аналогичные идеи давно прижились в экосистемах Python и JavaScript, но для Ruby до сих пор приходилось собирать всё вручную из отдельных SDK.
Ключевые отличия на фоне типичных клиентских библиотек отдельных провайдеров:
- Один интерфейс вместо десятка SDK. У OpenAI, Anthropic, Google, Amazon и других свои клиенты, форматы ответов и соглашения об именах. RubyLLM прячет эти различия за единым API.
- Модельный реестр на 800+ позиций. Вместо ручного выбора конкретной версии GPT или Claude можно ориентироваться на возможности и цену, которые RubyLLM знает из своего реестра.
- Глубокая интеграция с Rails.
acts_as_chatи готовый генератор Chat UI — редкая опция среди «сырьевых» SDK, которые обычно не думают о веб-слое и хранении истории диалогов. - Инструменты и агенты из коробки. Механизм
RubyLLM::ToolиRubyLLM::Agentпревращает Ruby-код в «действия» для ИИ без сторонних фреймворков.
Конкретных бенчмарков по скорости против официальных SDK или других обёрток создатели не приводят. Основной упор — на унификацию интерфейса, богатый набор сценариев (чат, vision, файлы, эмбеддинги, модерация, агенты) и минимальные зависимости.
Установка
RubyLLM распространяется как обычный гем.
Добавьте его в Gemfile:
gem 'ruby_llm'
Затем выполните:
bundle install
Настройте ключи API в инициализаторе, например для OpenAI:
# config/initializers/ruby_llm.rb
RubyLLM.configure do |config|
config.openai_api_key = ENV['OPENAI_API_KEY']
end
Как запустить
Базовый чат за пару минут
# Создаём чат
chat = RubyLLM.chat
# Обычный текстовый запрос
chat.ask "What's the best way to learn Ruby?"
Анализ файлов разных типов
# Изображение
chat.ask "What's in this image?", with: "ruby_conf.jpg"
# Видео
chat.ask "What's happening in this video?", with: "video.mp4"
# Аудио (встреча)
chat.ask "Describe this meeting", with: "meeting.wav"
# Документ
chat.ask "Summarize this document", with: "contract.pdf"
# Код
chat.ask "Explain this code", with: "app.rb"
# Несколько файлов одновременно
chat.ask "Analyze these files", with: ["diagram.png", "report.pdf", "notes.txt"]
Стриминг ответов
chat.ask "Tell me a story about Ruby" do |chunk|
print chunk.content
end
Генерация изображений
RubyLLM.paint "a sunset over mountains in watercolor style"
Эмбеддинги
RubyLLM.embed "Ruby is elegant and expressive"
Транскрибация аудио
RubyLLM.transcribe "meeting.wav"
Модерация контента
RubyLLM.moderate "Check if this text is safe"
Инструменты: даём ИИ доступ к вашему коду
class Weather < RubyLLM::Tool
desc "Get current weather"
def execute(latitude:, longitude:)
url = "https://api.open-meteo.com/v1/forecast?" \
"latitude=#{latitude}&longitude=#{longitude}" \
"¤t=temperature_2m,wind_speed_10m"
JSON.parse(Faraday.get(url).body)
end
end
chat.with_tool(Weather).ask "What's the weather in Berlin?"
Агенты с инструкциями и инструментами
class WeatherAssistant < RubyLLM::Agent
model "gpt-5-nano"
instructions "Be concise and always use tools for weather."
tools Weather
end
WeatherAssistant.new.ask "What's the weather in Berlin?"
Структурированный вывод по схеме
class ProductSchema < RubyLLM::Schema
string :name
number :price
array :features do
string
end
end
response = chat.with_schema(ProductSchema)
.ask "Analyze this product", with: "product.txt"
Rails-интеграция
У RubyLLM есть генератор для интеграции с Rails и отдельный генератор чат-интерфейса.
Установка интеграции:
# Установить Rails-интеграцию
bin/rails generate ruby_llm:install
bin/rails db:migrate
bin/rails ruby_llm:load_models # v1.13+
# Добавить Chat UI (по желанию)
bin/rails generate ruby_llm:chat_ui
Пример модели и использования:
class Chat < ApplicationRecord
acts_as_chat
end
chat = Chat.create!(model: "claude-sonnet-4")
chat.ask "What's in this file?", with: "report.pdf"
RubyLLM закрывает для Ruby-разработчиков задачу: «хочу использовать GPT, Claude, Gemini, Ollama и ещё сотни моделей через один понятный API, не тонуть в десятке SDK и несовместимых форматах ответов». Для тех, кто строит ИИ-функции поверх Rails, это особенно актуально.